Die Reihenfolge, in der Oracle die in der where-Klausel gefundenen Bedingungen auswertet, ist nicht festgelegt. Das heißt, es kann die Bedingung mit TO_DATE vor den anderen Kriterien auswerten, in diesem Fall schlägt die Abfrage fehl. Um dies zu verhindern, fügen Sie Ihrer Abfrage den Hinweis "ordered_predicates" hinzu, aber beachten Sie, dass dies möglicherweise eine zusätzliche manuelle Optimierung erfordert, um die Leistung zu verbessern.
SELECT /*+ ordered_predicates */
To_Date(c.Value, 'MM/DD/YYYY HH24:MI:SS') somedate
FROM properties$aud a,
template_properties$aud b,
consumable_properties$aud c
WHERE Lower(a.name) = 'somedate'
AND a.id = b.property_id
AND b.id = c.template_property_id
AND To_Date(c.Value, 'MM/DD/YYYY HH24:MI:SS') IS NOT NULL
Anscheinend ordered_predicates
ist ab 10g veraltet. In diesem Fall besteht Ihre einzige Möglichkeit darin, eine Unterabfrage so zu verwenden, dass der Optimierer gezwungen ist, sie zuerst auszuwerten (dh er kann die Abfragen nicht kombinieren). Der einfachste Weg, dies zu tun, ist, rownum
zu setzen in der where-Anweisung der inneren Abfrage.
SELECT To_Date(c.Value, 'MM/DD/YYYY HH24:MI:SS') somedate
FROM (SELECT value
FROM properties$aud a,
template_properties$aud b,
consumable_properties$aud c
WHERE Lower(a.name) = 'somedate'
AND a.id = b.property_id
AND b.id = c.template_property_id
AND rownum > 0)
WHERE To_Date(c.Value, 'MM/DD/YYYY HH24:MI:SS') IS NOT NULL