MySQL Orderby um número, Nulls last

Atualmente estou fazendo um OrderBy muito básico na minha declaração.

SELECT * FROM tablename WHERE visible=1 ORDER BY position ASC, id DESC 

O problema com isso é que as inputs NULL para ‘position’ são tratadas como 0. Portanto, todas as inputs com posição como NULL aparecem antes daquelas com 1,2,3,4. por exemplo:

 NULL, NULL, NULL, 1, 2, 3, 4 

Existe uma maneira de obter a seguinte ordem:

 1, 2, 3, 4, NULL, NULL, NULL. 

O MySQL possui uma syntax não documentada para ordenar os nulos por último. Coloque um sinal de menos (-) antes do nome da coluna e alterne o ASC para DESC:

 SELECT * FROM tablename WHERE visible=1 ORDER BY -position DESC, id DESC 

É essencialmente o inverso da position DESC colocando os valores NULL por último, mas de outra forma o mesmo que a position ASC .

Uma boa referência está aqui http://troels.arvin.dk/db/rdbms#select-order_by

Eu achei esta uma boa solução para a maior 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 

Substitua 999999999 com o que sempre o valor máximo para o campo é

Tente usar essa consulta:

 SELECT * FROM tablename WHERE visible=1 ORDER BY CASE WHEN position IS NULL THEN 1 ELSE 0 END ASC,id DESC 

Você pode unir seus NULLs na instrução ORDER BY :

 select * from tablename where  order by coalesce(position, 0) ASC, id DESC 

Se você quiser que os NULLs ordenem na parte inferior, tente coalesce(position, 100000) . (Faça o segundo número maior que todas as outras position no database.)

 SELECT * FROM tablename WHERE visible=1 ORDER BY CASE WHEN `position` = 0 THEN 'a' END , position ASC 

Você pode trocar instâncias de NULL por um valor diferente para classificá-las primeiro (como 0 ou -1) ou por último (um número grande ou uma 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 uma coluna DATE , você pode usar:


NULLs por último:

 ORDER BY IFNULL(`myDate`, '9999-12-31') ASC 

Blanks por último:

 ORDER BY IF(`myDate` = '', '9999-12-31', `myDate`) ASC 

NULL LAST

 SELECT * FROM table_name ORDER BY id IS NULL, id ASC 

Por que você não pede por NULLS LAST?

 SELECT * FROM tablename WHERE visible = 1 ORDER BY position ASC NULLS LAST, id DESC