Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Literal stimmt nicht mit der Formatzeichenfolge für Oracle SQL to_date in einer Zeichenfolgenspalte überein

Die Reihenfolge, in der Oracle die in der where-Klausel gefundenen Bedingungen auswertet, ist nicht festgelegt. Das heißt, es kann die Bedingung mit TO_DATE vor den anderen Kriterien auswerten, in diesem Fall schlägt die Abfrage fehl. Um dies zu verhindern, fügen Sie Ihrer Abfrage den Hinweis "ordered_predicates" hinzu, aber beachten Sie, dass dies möglicherweise eine zusätzliche manuelle Optimierung erfordert, um die Leistung zu verbessern.

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

Anscheinend ordered_predicates ist ab 10g veraltet. In diesem Fall besteht Ihre einzige Möglichkeit darin, eine Unterabfrage so zu verwenden, dass der Optimierer gezwungen ist, sie zuerst auszuwerten (dh er kann die Abfragen nicht kombinieren). Der einfachste Weg, dies zu tun, ist, rownum zu setzen in der where-Anweisung der inneren Abfrage.

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