sql >> Database teknologi >  >> RDS >> Oracle

Literal matcher ikke formatstreng for Oracle SQL to_date på en strengkolonne

Den rækkefølge, som Oracle evaluerer betingelserne i where-klausulen, er ikke fast. Det vil sige, at den kan vælge at evaluere betingelsen indeholdende TO_DATE før de andre kriterier, i hvilket tilfælde forespørgslen mislykkes. For at forhindre det skal du tilføje ordered_predicates-tip til din forespørgsel, men vær opmærksom på, at dette kan kræve yderligere manuel justering for at forbedre ydeevnen.

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

Tilsyneladende ordered_predicates er forældet startende med 10g. I så fald tror jeg, at din eneste mulighed er at bruge en underforespørgsel på en sådan måde, at optimizer er tvunget til at evaluere den først (dvs. den kan ikke kombinere forespørgslerne). Den nemmeste måde at gøre dette på er at sætte rownum i where-sætningen af ​​den indre forespørgsel.

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. Konverter fra MySQL datetime til et andet format med PHP

  2. Hvordan fjerner man dårlige tegn, der ikke er egnede til utf8-kodning i MySQL?

  3. Dynamisk tabelopdeling i Oracle

  4. WHERE-klausul i OPEN QUERY