Ordningen som Oracle utvärderar villkoren i where-satsen är inte fixerad. Det vill säga att den kan välja att utvärdera villkoret som innehåller TO_DATE före de andra kriterierna, i vilket fall frågan misslyckas. För att förhindra det, lägg till ordered_predicates-tipset i din fråga, men tänk på att detta kan kräva ytterligare manuell justering för att förbättra prestandan.
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
Tydligen ordered_predicates
är utfasad med början på 10g. I så fall tror jag att ditt enda alternativ är att använda en underfråga på ett sådant sätt att optimeraren tvingas utvärdera den först (dvs. den kan inte kombinera frågorna). Det enklaste sättet att göra detta är att sätta rownum
i where-satsen för den inre frågan.
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