sql - guia - versiones de qgis




SQL cómo hacer que los valores nulos sean los últimos al ordenar de forma ascendente (9)

(Un "poco" tarde, pero esto no ha sido mencionado en absoluto)

Usted no especificó su DBMS.

En SQL estándar (y en la mayoría de los DBMS modernos como Oracle, PostgreSQL, DB2, Firebird, Apache Derby, HSQLDB y H2) puede especificar NULLS LAST o NULLS FIRST :

Usa NULLS LAST para ordenarlos hasta el final:

select *
from some_table
order by some_column DESC NULLS LAST

Tengo una tabla SQL con un campo de fecha y hora. El campo en cuestión puede ser nulo. Tengo una consulta y quiero que los resultados se ordenen de forma ascendente por el campo de fecha y hora, sin embargo, quiero filas donde el campo de fecha y hora sea nulo al final de la lista, no al principio.

¿Hay una manera simple de lograr eso?


Cuando la columna de su orden es numérica (como un rango) puede multiplicarla por -1 y luego descender. Mantendrá el orden que está esperando, pero se pondrá NULL en último lugar.

select *
from table
order by -rank desc

Gracias a RedFilter por proporcionar una excelente solución al problema de la clasificación de campos de fecha y hora con posibilidad de nulos.

Estoy utilizando la base de datos de SQL Server para mi proyecto.

Cambiar el valor nulo de fecha y hora a '1' resuelve el problema de la clasificación de la columna de tipo de fecha y hora. Sin embargo, si tenemos una columna con un tipo de datos distinto al de datetime, entonces no se puede manejar.

Para manejar un tipo de columna varchar, intenté usar 'ZZZZZZZ' porque sabía que la columna no tiene valores que comiencen con 'Z'. Funcionó como se esperaba.

En las mismas líneas, utilicé valores máximos +1 para int y otros tipos de datos para obtener la clasificación como se esperaba. Esto también me dio los resultados que se requerían.

Sin embargo, siempre sería ideal obtener algo más fácil en el motor de base de datos que podría hacer algo como:

Order by Col1 Asc Nulls Last, Col2 Asc Nulls First 

Como se mencionó en la respuesta proporcionada por a_horse_with_no_name.


La solución que usa el "caso" es universal, pero luego no use los índices.

order by case when MyDate is null then 1 else 0 end, MyDate

En mi caso, necesitaba rendimiento.

 SELECT smoneCol1,someCol2  
 FROM someSch.someTab
 WHERE someCol2 = 2101 and ( someCol1 IS NULL ) 
  UNION   
 SELECT smoneCol1,someCol2
 FROM someSch.someTab
 WHERE someCol2 = 2101 and (  someCol1 IS NOT NULL)  

Si su motor permite ORDER BY x IS NULL, x u ORDER BY x NULLS LAST use eso. Pero si no es así, esto podría ayudar:

Si está ordenando por un tipo numérico, puede hacer esto: (Pedir prestado el esquema de otra respuesta ).

SELECT *          
FROM Employees
ORDER BY ISNULL(DepartmentId*0,1), DepartmentId;

Cualquier número que no sea nulo se convierte en 0, y los nulos se convierten en 1, lo que ordena los nulos en último lugar.

También puedes hacer esto por cuerdas:

SELECT *
FROM Employees
ORDER BY ISNULL(LEFT(LastName,0),'a'), LastName

Porque 'a' > '' .

Esto incluso funciona con fechas coaccionando a un int que puede contener nulos y utilizando el método para los ints anteriores:

SELECT *
FROM Employees
ORDER BY ISNULL(CONVERT(INT, HireDate)*0, 1), HireDate

(Vamos a pretender que el esquema tiene HireDate).

Estos métodos evitan el problema de tener que idear o administrar un valor "máximo" de cada tipo o arreglo de consultas si el tipo de datos (y el máximo) cambia (ambos problemas sufren otras soluciones ISNULL). Además son mucho más cortos que un CASO.


También me encontré con esto y lo siguiente parece hacer el truco por mí, en MySQL y PostgreSQL:

ORDER BY date IS NULL, date DESC

tal como se encuentra en https://.com/a/7055259/496209



order by -cast([nativeDateModify] as bigint) desc

select MyDate
from MyTable
order by case when MyDate is null then 1 else 0 end, MyDate




order