Actualmente estoy haciendo un OrderBy muy básico en mi statement.
SELECT * FROM tablename WHERE visible=1 ORDER BY position ASC, id DESC
El problema con esto es que las entradas NULL para ‘posición’ se tratan como 0. Por lo tanto, todas las entradas con posición como NULL aparecen antes que aquellas con 1,2,3,4. p.ej:
NULL, NULL, NULL, 1, 2, 3, 4
¿Hay alguna forma de lograr el siguiente orden?
1, 2, 3, 4, NULL, NULL, NULL.
MySQL tiene una syntax no documentada para ordenar los nulos la última vez. Coloque un signo menos (-) antes del nombre de la columna y cambie el ASC a DESC:
SELECT * FROM tablename WHERE visible=1 ORDER BY -position DESC, id DESC
Es esencialmente el inverso de la position DESC
colocando los valores NULL al final, pero por lo demás lo mismo que la position ASC
.
Una buena referencia es aquí http://troels.arvin.dk/db/rdbms#select-order_by
Encontré que esta es una buena solución en su mayor parte:
SELECT * FROM table ORDER BY ISNULL(field), field ASC;
Algo como
SELECT * FROM tablename where visible=1 ORDER BY COALESCE(position, 999999999) ASC, id DESC
Reemplace 999999999 con lo que sea el valor máximo para el campo es
Intenta usar esta consulta:
SELECT * FROM tablename WHERE visible=1 ORDER BY CASE WHEN position IS NULL THEN 1 ELSE 0 END ASC,id DESC
Puede unir sus NULL en la instrucción ORDER BY
:
select * from tablename where order by coalesce(position, 0) ASC, id DESC
Si desea que los NULLs se clasifiquen en la parte inferior, intente coalesce(position, 100000)
. (Haga que el segundo número sea más grande que todas las otras position
en el archivo db).
SELECT * FROM tablename WHERE visible=1 ORDER BY CASE WHEN `position` = 0 THEN 'a' END , position ASC
Puede intercambiar instancias de NULL con un valor diferente para ordenarlas primero (como 0 o -1) o por último (un número grande o una letra) …
SELECT field1, IF(field2 IS NULL, 9999, field2) as ordered_field2 FROM tablename WHERE visible = 1 ORDER BY ordered_field2 ASC, id DESC
Para una columna de DATE
puede usar:
NULLS último:
ORDER BY IFNULL(`myDate`, '9999-12-31') ASC
Los espacios vacíos duran:
ORDER BY IF(`myDate` = '', '9999-12-31', `myDate`) ASC
NULL LAST
SELECT * FROM table_name ORDER BY id IS NULL, id ASC
¿Por qué no haces tu pedido por NULLS LAST?
SELECT * FROM tablename WHERE visible = 1 ORDER BY position ASC NULLS LAST, id DESC