De volgorde waarin Oracle de voorwaarden in de waar-clausule evalueert, staat niet vast. Dat wil zeggen dat het ervoor kan kiezen om de voorwaarde die TO_DATE bevat vóór de andere criteria te evalueren, in welk geval de query zal mislukken. Om dat te voorkomen, voegt u de hint order_predicates toe aan uw zoekopdracht, maar houd er rekening mee dat hiervoor mogelijk extra handmatige afstemming nodig is om de prestaties te verbeteren.
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
Blijkbaar ordered_predicates
wordt afgeraden vanaf 10g. In dat geval denk ik dat je enige optie is om een subquery zo te gebruiken dat de optimizer deze eerst moet evalueren (d.w.z. het kan de query's niet combineren). De eenvoudigste manier om dit te doen is door rownum
in de waar-instructie van de innerlijke vraag.
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