L'ordine in cui Oracle valuta le condizioni trovate nella clausola where non è fisso. Vale a dire che può scegliere di valutare la condizione contenente TO_DATE prima degli altri criteri, nel qual caso la query avrà esito negativo. Per evitarlo, aggiungi l'hint order_predicates alla tua query, ma tieni presente che ciò potrebbe richiedere un'ulteriore messa a punto manuale per migliorare le prestazioni.
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
Apparentemente ordered_predicates
è deprecato a partire da 10 g. In tal caso, penso che la tua unica opzione sia quella di utilizzare una sottoquery in modo tale che l'ottimizzatore sia costretto a valutarla prima (cioè non può combinare le query). Il modo più semplice per farlo è inserire rownum
nell'istruzione where della query interna.
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