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 é que as entradas NULL para 'position' são tratadas como 0. Portanto, todas as entradas 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 o seguinte pedido:
1, 2, 3, 4, NULL, NULL, NULL.
mysql
sql-order-by
JonB
fonte
fonte
Respostas:
O MySQL possui uma sintaxe não documentada para classificar os nulos por último. Coloque um sinal de menos (-) antes do nome da coluna e mude o ASC para DESC:
É essencialmente o inverso de
position DESC
colocar os valores NULL por último, mas o mesmo queposition ASC
.Uma boa referência está aqui http://troels.arvin.dk/db/rdbms#select-order_by
fonte
- col_name
é uma expressão (0 - col_name
) que a cláusula ORDER BY aceita. Claro que isso só funciona para colunas numéricas.date
etime
colunas também! (MySQL 5.5). Eu acho que (tenho preguiça de verificar) funciona para todas as colunas semelhantes a números (carimbo de data / hora, flutuação ...).Eu achei que essa era uma boa solução para a maior parte:
fonte
SELECT * FROM table ORDER BY ISNULL(field) ASC;
(MySQL 5.5)NULLS LAST
|NULLS FIRST
para invertê-lo em vez das soluções alternativas aqui.Algo como
Substitua 999999999 por qualquer que seja o valor máximo do campo
fonte
NULL ÚLTIMO
fonte
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) ...
fonte
Tente usar esta consulta:
fonte
Você pode unir seus NULLs na
ORDER BY
instrução:Se você deseja que os NULLs sejam classificados na parte inferior, tente
coalesce(position, 100000)
. (Faça o segundo número maior que todos os outrosposition
no banco de dados.)fonte
fonte
Para uma
DATE
coluna, você pode usar:Nulos por último:
Espaços em branco por último:
fonte
Para alcançar o seguinte resultado:
1, 2, 3, 4, NULL, NULL, NULL.
USE sintaxe, coloque
-(minus sign)
antes do nome do campo e use inverso order_type (como: se você deseja solicitar por ordem ASC, use DESC ou, se desejar, ordem DESC, use ASC)SELECT * FROM tablename WHERE visible=1 ORDER BY -position DESC
fonte
Isso está funcionando bem:
fonte
Por que você não pede por NULLS ÚLTIMO?
fonte
NULLS LAST
- qual versão do MySQL foi introduzida?