Oracle
 sql >> Base de données >  >> RDS >> Oracle

Ordre Oracle des résultats à l'aide d'une colonne varchar mixte mais d'une clause where numérique

Le ORDER BY n'a rien à voir avec le problème -- du moins pas directement.

SQL en général, et Oracle en particulier, ne font aucune promesse quant à l'ordre d'évaluation des conditions dans le WHERE clause. Par conséquent, le WHERE clause n'est pas (nécessairement) évaluée dans l'ordre écrit. La présence du ORDER BY pourrait affecter l'ordre d'évaluation des conditions dans ce cas particulier.

En général, c'est vraiment une mauvaise pratique de mélanger les types de données, comme vous le faites. Mais, vous pouvez garantir l'ordre d'évaluation en utilisant 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);

Je ne recommande pas de faire cela. Je veux seulement souligner ce case force l'ordre d'évaluation des conditions.

La bonne solution consiste à utiliser des comparaisons de chaînes. Dans ce cas, j'irais avec :

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

Alternativement, vous pouvez faire :

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

Notez que pour plus de précision, vous devez tenir compte de la longueur.