sql >> Databasteknik >  >> RDS >> Oracle

Oracle-ordning av resultat med en blandad varchar-kolumn men numerisk where-sats

ORDER BY har inget med problemet att göra -- åtminstone inte direkt.

SQL i allmänhet, och Oracle i synnerhet, ger inga löften om ordningen för utvärdering av villkor i WHERE klausul. Därför WHERE klausulen utvärderas inte (nödvändigtvis) i den ordning som skrivs. Förekomsten av ORDER BY kan påverka ordningen för utvärderingen av förhållandena i detta särskilda fall.

I allmänhet är det riktigt dålig praxis att blanda datatyper, på det sätt som du gör det. Men du kan garantera utvärderingsordningen genom att använda 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);

Jag rekommenderar inte att du gör detta. Jag vill bara påpeka det case tvingar fram ordningen för utvärdering av villkoren.

Den korrekta lösningen är att använda strängjämförelser. I det här fallet skulle jag 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öra:

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

Observera att du måste ta hänsyn till längden för noggrannhet.



  1. Hur kan jag lägga till inledande nollor till datum i Oracle?

  2. Förstå flera kolumnindex i MySQL-fråga

  3. SQL Server Databas Objects Statistik

  4. MySQL:IF / THEN-satser i lagrade procedurer