sql - guia - qgis español
SQL cómo hacer que los valores nulos sean los últimos al ordenar de forma ascendente (13)
(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
En Oracle, puede usar NULLS FIRST
o NULLS LAST
: especifica que los valores NULL deben devolverse antes / después de los valores no NULL:
ORDER BY { column-Name | [ ASC | DESC ] | [ NULLS FIRST | NULLS LAST ] }
Por ejemplo:
ORDER BY date DESC NULLS LAST
Ref: http://docs.oracle.com/javadb/10.8.3.0/ref/rrefsqlj13658.html
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)
Puede utilizar la función incorporada para verificar si hay nulo o no nulo, como se muestra a continuación. Lo pruebo y está funcionando bien.
select MyDate from MyTable order by ISNULL(MyDate,1) DESC, MyDate ASC;
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
USE la función NVL
select * from MyTable order by NVL(MyDate, to_date(''1-1-1'',''DD-MM-YYYY''))
SELECT *
FROM Employees
ORDER BY ISNULL(DepartmentId, 99999);
order by -cast([nativeDateModify] as bigint) desc
order by coalesce(date-time-field,large date in future)
select MyDate
from MyTable
order by case when MyDate is null then 1 else 0 end, MyDate