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

Oracle rækkefølge af resultater ved hjælp af en blandet varchar-kolonne, men numerisk where-klausul

ORDER BY har intet med problemet at gøre -- i hvert fald ikke direkte.

SQL generelt, og Oracle i særdeleshed, giver ingen løfter om rækkefølgen af ​​evaluering af betingelser i WHERE klausul. Derfor er WHERE klausul vurderes ikke (nødvendigvis) i den rækkefølge, der er skrevet. Tilstedeværelsen af ​​ORDER BY kan påvirke rækkefølgen af ​​vurdering af forholdene i dette særlige tilfælde.

Generelt er det virkelig dårlig praksis at blande datatyper, sådan som du gør det. Men du kan garantere rækkefølgen af ​​evalueringen ved at bruge case :

select *
from   TABLE
where  CLASS = 3 
       'true' = (case when class <> 3 then 'false'
                      when (CODE >= 210 and CODE < 220) or CODE = 291) then 'true'
                 end);

Jeg anbefaler ikke at gøre dette. Jeg vil kun påpege det case fremtvinger rækkefølgen af ​​evaluering af betingelserne.

Den korrekte løsning er at bruge strengsammenligninger. I dette tilfælde ville jeg gå med:

select *
from   TABLE
where  CLASS = 3 AND
       CODE in ('210', '211', '212', '213', '214', '215', '216', '217', '218', '219', '291')

Alternativt kan du gøre:

where  CLASS = 3 and length(CODE) = 3 and
       ((CODE >= '210' and CODE < '220') or CODE = '291')

Bemærk, at du for nøjagtigheden skal tage højde for længden.



  1. Indsæt nye rækker fra lokal tabel til fjerntabel

  2. Hvordan bruger man billeder i Android SQLite, der er større end begrænsningerne for et CursorWindow?

  3. MySQL connector 6.7.4 og Entity Framework 5 undtagelser

  4. få alle varer i kategorien og dens underordnede