Den rækkefølge, som Oracle evaluerer betingelserne i where-klausulen, er ikke fast. Det vil sige, at den kan vælge at evaluere betingelsen indeholdende TO_DATE før de andre kriterier, i hvilket tilfælde forespørgslen mislykkes. For at forhindre det skal du tilføje ordered_predicates-tip til din forespørgsel, men vær opmærksom på, at dette kan kræve yderligere manuel justering for at forbedre ydeevnen.
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
Tilsyneladende ordered_predicates
er forældet startende med 10g. I så fald tror jeg, at din eneste mulighed er at bruge en underforespørgsel på en sådan måde, at optimizer er tvunget til at evaluere den først (dvs. den kan ikke kombinere forespørgslerne). Den nemmeste måde at gøre dette på er at sætte rownum
i where-sætningen af den indre forespørgsel.
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