Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Ordenação Oracle de resultados usando uma coluna varchar mista, mas cláusula numérica where


O ORDER BY não tem nada a ver com o problema - pelo menos não diretamente.

SQL em geral, e Oracle em particular, não fazem promessas sobre a ordem de avaliação das condições no WHERE cláusula. Portanto, o WHERE cláusula não é (necessariamente) avaliada na ordem escrita. A presença do ORDER BY pode afetar a ordem de avaliação das condições neste caso particular.

Em geral, é uma prática muito ruim misturar tipos de dados, do jeito que você está fazendo. Mas, você pode garantir a ordem de avaliação usando 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);

Não recomendo fazer isso. Eu só quero salientar que case força a ordem de avaliação das condições.

A solução correta é usar comparações de strings. Nesse caso, eu iria com:
select *
from   TABLE
where  CLASS = 3 AND
       CODE in ('210', '211', '212', '213', '214', '215', '216', '217', '218', '219', '291')

Alternativamente, você poderia fazer:
where  CLASS = 3 and length(CODE) = 3 and
       ((CODE >= '210' and CODE < '220') or CODE = '291')

Observe que, para precisão, você precisa levar em consideração o comprimento.