Oracle
 sql >> Base de données >  >> RDS >> Oracle

Le littéral ne correspond pas à la chaîne de format pour Oracle SQL to_date sur une colonne de chaîne

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