L'ordre dans lequel Oracle évalue les conditions trouvées dans la clause where n'est pas fixe. C'est-à-dire qu'il peut choisir d'évaluer la condition contenant TO_DATE avant les autres critères, auquel cas la requête échouera. Pour éviter cela, ajoutez l'indice order_predicates à votre requête, mais sachez que cela peut nécessiter un réglage manuel supplémentaire pour améliorer les performances.
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
Apparemment ordered_predicates
est obsolète à partir de 10g. Dans ce cas, je pense que votre seule option est d'utiliser une sous-requête de manière à ce que l'optimiseur soit obligé de l'évaluer en premier (c'est-à-dire qu'il ne peut pas combiner les requêtes). La façon la plus simple de le faire est de mettre rownum
dans l'instruction where de la requête interne.
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