sql >> Base de Datos >  >> RDS >> Oracle

Ordenación de resultados de Oracle utilizando una columna varchar mixta pero cláusula numérica where

El ORDER BY no tiene nada que ver con el problema, al menos no directamente.

SQL en general, y Oracle en particular, no hacen ninguna promesa sobre el orden de evaluación de las condiciones en WHERE cláusula. Por lo tanto, el WHERE La cláusula no se evalúa (necesariamente) en el orden escrito. La presencia del ORDER BY podría afectar el orden de evaluación de las condiciones en este caso particular.

En general, es realmente una mala práctica mezclar tipos de datos, de la forma en que lo está haciendo. Pero puede garantizar el orden de evaluación 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);

No recomiendo hacer esto. Solo quiero señalar ese case fuerza el orden de evaluación de las condiciones.

La solución correcta es usar comparaciones de cadenas. En este caso, iría con:

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

Alternativamente, podrías hacer:

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

Tenga en cuenta que, para obtener precisión, debe tener en cuenta la longitud.