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 manera 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?
sql
sorting
sql-order-by
David Božjak
fuente
fuente
Respuestas:
fuente
order by case when MyDate is null then 1 else 0 end
es una forma muy larga de decirORDER BY MyDate IS NULL
order by 0
se interpreta como un índice de columna, y los índices de columna se basan en 1. Para ordenar una consulta por la tercera columna, puede decirorder by 3
(que es una idea terrible para las consultas de producción), pero muy útil (como está*
) al experimentar.(Un "poco" tarde, pero esto no se ha mencionado en absoluto)
No especificó su DBMS.
En SQL estándar (y el DBMS más moderno como Oracle, PostgreSQL, DB2, Firebird, Apache Derby, HSQLDB y H2) puede especificar
NULLS LAST
oNULLS FIRST
:Use
NULLS LAST
para ordenarlos hasta el final:fuente
NULLS FIRST
yNULLS LAST
se han agregado en SQL: 2003, pero no hay una implementación estándar disponible en los diferentes DMBS '. Dependiendo del motor de la base de datos, useORDER BY expr some_column DESC NULLS LAST
(Oracle),ORDER BY ISNULL(some_column, 1), some_column ASC
(MSSQL) oORDER BY ISNULL(some_column), some_column ASC
(MySQL con una implementación ISNULL () diferente).ASC
/DESC
con nulos, algunos sí. Entonces, la única manera de garantizar esto es usarloNULL FIRST/LAST
si el DBMS lo admite. En él documenta lo que pretende. El uso deisnull()
u otras funciones es una solución alternativa para la falta de soporte paraNULLS FIRST/LAST
(que es compatible con Oracle, PostgreSQL, DB2, Firebird, Apache Derby, HSQLDB y H2)expr
palabra clave cuando se usan NULLS FIRST / LAST. Y gracias por los nulos mostrados primero / último que varían de un tipo de base de datos a otro, ¡no lo sabía!NULLS LAST
no funcionó en mi base de datos MySQL.También me topé con esto y lo siguiente parece ser el truco para mí, en MySQL y PostgreSQL:
tal como se encuentra en https://stackoverflow.com/a/7055259/496209
fuente
IS NULL
yIS NOT NULL
no funcionó en mi base de datos MySQL.fuente
Puede usar la función integrada para verificar si es nulo o no, como se muestra a continuación. Lo pruebo y funciona bien.
select MyDate from MyTable order by ISNULL(MyDate,1) DESC, MyDate ASC;
fuente
ISNULL(MyDate) DESC, MyDate ASC
, pero no se ordenó en el orden correcto.Si su motor lo permite
ORDER BY x IS NULL, x
o loORDER BY x NULLS LAST
usa. Pero si no es así, esto podría ayudar:Si está ordenando por un tipo numérico, puede hacer esto: (Tomar prestado el esquema de otra respuesta ).
Cualquier número no nulo se convierte en 0 y los nulos se convierten en 1, lo que clasifica los nulos en último lugar.
También puede hacer esto para cadenas:
Porque
'a'
>''
.Esto incluso funciona con fechas coaccionando a un int anulable y usando el método para las entradas anteriores:
(Supongamos que el esquema tiene HireDate).
Estos métodos evitan el problema de tener que encontrar o administrar un valor "máximo" de cada tipo o solucionar consultas si el tipo de datos (y el máximo) cambia (ambos problemas que sufren otras soluciones ISNULL). Además, son mucho más cortos que un CASO.
fuente
Cuando su columna de orden es numérica (como un rango), puede multiplicarla por -1 y luego ordenarla en orden descendente. Mantendrá el orden que está experimentando, pero ponga NULL al final.
fuente
Ver esta publicación de blog .
fuente
Gracias RedFilter por proporcionar una excelente solución al problema de la clasificación de campos de fecha y hora anulables.
Estoy usando la base de datos SQL Server para mi proyecto.
Cambiar el valor nulo de fecha y hora a '1' resuelve el problema de ordenar la columna de tipo de datos de fecha y hora. Sin embargo, si tenemos una columna con otro tipo de datos que no sea datetime, entonces no se puede manejar.
Para manejar una clasificación de columna varchar, intenté usar 'ZZZZZZZ' ya que sabía que la columna no tiene valores que comiencen con 'Z'. Funcionó como se esperaba.
En la misma línea, utilicé valores máximos +1 para int y otros tipos de datos para obtener el orden como se esperaba. Esto también me dio los resultados necesarios.
Sin embargo, siempre sería ideal obtener algo más fácil en el motor de la base de datos que podría hacer algo como:
Como se menciona en la respuesta proporcionada por a_horse_with_no_name.
fuente
En Oracle, puede usar
NULLS FIRST
oNULLS LAST
: especifica que los valores NULL deben devolverse antes / después de los valores no NULL:Por ejemplo:
Ref: http://docs.oracle.com/javadb/10.8.3.0/ref/rrefsqlj13658.html
fuente
Si está utilizando MariaDB, mencionan lo siguiente en el documentación de valores NULL .
Lo anterior muestra dos formas de ordenar por valores NULL, también puede combinarlos con las palabras clave ASC y DESC. Por ejemplo, la otra forma de obtener los valores NULL primero sería:
fuente
La solución que usa el "caso" es universal, pero luego no use los índices.
En mi caso, necesitaba rendimiento.
fuente
UNION ALL
.USE la función NVL
Aquí está la alternativa de NVL en el DBMS más famoso
fuente
fuente