sql >> Databasteknik >  >> RDS >> Oracle

Literal matchar inte formatsträngen för Oracle SQL to_date i en strängkolumn

Ordningen som Oracle utvärderar villkoren i where-satsen är inte fixerad. Det vill säga att den kan välja att utvärdera villkoret som innehåller TO_DATE före de andra kriterierna, i vilket fall frågan misslyckas. För att förhindra det, lägg till ordered_predicates-tipset i din fråga, men tänk på att detta kan kräva ytterligare manuell justering för att förbättra prestandan.

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

Tydligen ordered_predicates är utfasad med början på 10g. I så fall tror jag att ditt enda alternativ är att använda en underfråga på ett sådant sätt att optimeraren tvingas utvärdera den först (dvs. den kan inte kombinera frågorna). Det enklaste sättet att göra detta är att sätta rownum i where-satsen för den inre frågan.

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


  1. SQL orderadress efter husnummer

  2. Homebrew, MySQL 8-stöd

  3. Hur man installerar och konfigurerar MaxScale för MariaDB

  4. SQL:Välj dynamiskt kolumnnamn baserat på variabel