¿Por qué es que cuando tenemos un valor NULL en una columna y ordenamos por el valor ascendente, los NULL se ordenan primero?
select 1 as test
union all
select 2
union all
select NULL
union all
select 3
union all
select 4
order by test
resultados en
NULL
1
2
3
4
Sigo pensando que NULL significa "Indeterminante" o posible "Desconocido". Si eso es cierto, ¿no lo ordenarían al final, ya que el valor podría ser mayor que todos los demás valores? (¿O es esta una opción de clasificación en alguna parte?)
Estoy en SQL Server 2008R2, pero sospecho que esto es cierto en todos los servidores SQL, y probablemente en todos los RDBMS.
sql-server
database-theory
sorting
Ricardo
fuente
fuente
desc
orden para mostrar las cosas más grandes o más recientes, en cuyo caso me alegraría que las cosas nulas sean las últimas.Respuestas:
NULL significa desconocido. Ninguna otra interpretación es válida.
No hay podría ser . No hay valor potencial . Desconocido es desconocido es desconocido.
En cuanto a por qué aparece primero, en lugar de al final, esto no es atendido por los estándares SQL publicados y desafortunadamente se deja a discreción del proveedor de RDBMS:
fuente
Está en lo correcto, lo que
NULL
puede significar 'Indeterminante' o 'Desconocido' o 'Aún no se conoce' o 'No se aplica'. Pero no hay razón para poner a los nulos primero o último. Si no conocemos los valores reales, entonces tehy puede ser pequeño o grande.Creo que el estándar para determinar el comportamiento deseado de Nulls durante la ordenación es:
Lamentablemente, SQL-Server aún no ha adoptado esta sintaxis. Si no me equivoco, PostgreSQL y Oracle lo tienen.
Una solución:
Otra solución que necesita un ajuste según el tipo de datos, pero no se formará bien, ya que no puede usar un índice en
(test)
:fuente
No sé por qué se hace de esa manera, pero, por definición, los NULLS no se pueden comparar con los que no son NULLS, por lo que deben ir al principio o al final (la respuesta de Mark cubre esto con mucho más detalle).
Para obtener el comportamiento que desea: Hasta donde yo sé, no hay una opción de clasificación para poner los nulos en último lugar, por lo que debe modificarlo utilizando una columna calculada para forzarlos al último. Sin embargo, en SQL Server no puede ordenar por una columna calculada (
CASE WHEN ...
) cuando sus datos contienen un operador establecido (UNION ALL
). Entonces:Funcionará para ordenar los nulos al final. Si usted tiene que utilizar
UNION
(oEXCEPT
oINTERSECTS
) para generar el conjunto de datos, y luego volcar los datos a una tabla temporal que el anterior.fuente
Si se trata de números, también puede usar
NULL
son los valores más bajos posibles, porDESC
lo tanto los pone al final. Mientras tanto, los valores no nulos tienen el signo invertido, por lo que enDESC
realidad es unASC
valor real. Esto debería ser más rápidoCASE
y supongo que el optimizador de consultas también puede usar índices en latest
columna.fuente
(- test)
.