Orden de MySQL por número, nulos por último

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