Pořadí, podle kterého Oracle vyhodnocuje podmínky uvedené v klauzuli where, není pevně dané. To znamená, že se může rozhodnout vyhodnotit podmínku obsahující TO_DATE před ostatními kritérii, v takovém případě dotaz selže. Abyste tomu zabránili, přidejte do svého dotazu nápovědu order_preddicates, ale mějte na paměti, že to může vyžadovat další ruční ladění ke zlepšení výkonu.
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
Zřejmě ordered_predicates
je zastaralá počínaje 10 g. V takovém případě si myslím, že vaší jedinou možností je použít poddotaz takovým způsobem, že je optimalizátor nucen nejprve vyhodnotit (tj. nemůže dotazy kombinovat). Nejjednodušší způsob, jak to udělat, je zadat rownum
v příkazu where vnitřního dotazu.
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