sql >> Database >  >> RDS >> Oracle

Oracle-volgorde van resultaten met behulp van een gemengde varchar-kolom maar numerieke waar-clausule

De ORDER BY heeft niets met het probleem te maken -- althans niet rechtstreeks.

SQL in het algemeen, en Oracle in het bijzonder, doen geen beloftes over de volgorde van evaluatie van voorwaarden in de WHERE clausule. Vandaar dat de WHERE clausule wordt niet (noodzakelijkerwijs) geëvalueerd in de geschreven volgorde. De aanwezigheid van de ORDER BY kan de volgorde van evaluatie van de voorwaarden in dit specifieke geval beïnvloeden.

Over het algemeen is het echt een slechte gewoonte om gegevenstypen te mixen, zoals u het doet. Maar u kunt de volgorde van evaluatie garanderen door case . te gebruiken :

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);

Ik raad het niet aan om dit te doen. Ik wil er alleen op wijzen dat case dwingt de volgorde van evaluatie van de voorwaarden.

De juiste oplossing is om stringvergelijkingen te gebruiken. In dit geval zou ik gaan voor:

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

U kunt ook het volgende doen:

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

Merk op dat je voor nauwkeurigheid wel rekening moet houden met de lengte.



  1. hoe de database te vullen met behulp van procedures

  2. Een subquery gebruiken in de Against voor een FULLTEXT-zoekopdracht in Mysql

  3. Rails - SQLite3::SQLException:bijna GEBRUIK:syntaxisfout

  4. Django-armatuur laadt erg traag