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

Ordinamento Oracle dei risultati utilizzando una colonna varchar mista ma dove clausola numerica

Il ORDER BY non ha nulla a che fare con il problema, almeno non direttamente.

SQL in generale, e Oracle in particolare, non fanno promesse sull'ordine di valutazione delle condizioni nel WHERE clausola. Quindi, il WHERE clausola non è (necessariamente) valutata nell'ordine scritto. La presenza del ORDER BY potrebbe influenzare l'ordine di valutazione delle condizioni in questo caso particolare.

In generale, è davvero una cattiva pratica mescolare i tipi di dati, nel modo in cui lo stai facendo. Tuttavia, puoi garantire l'ordine di valutazione utilizzando 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);

Non consiglio di farlo. Voglio solo sottolineare quel case forza l'ordine di valutazione delle condizioni.

La soluzione corretta è utilizzare i confronti di stringhe. In questo caso, andrei con:

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

In alternativa, potresti fare:

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

Tieni presente che per la precisione devi tenere conto della lunghezza.