Problema:
Você deseja classificar as linhas pelo número do mês, com os nomes dos meses (você deseja que janeiro seja mostrado primeiro, dezembro por último).
Exemplo:
O
birthday
tabela contém duas colunas:name e birthday_month
. Os meses são dados em nomes, não em números. nome | aniversário_mês |
---|---|
Ronan Tisha | janeiro |
Dezembro | abril |
Angie Julia | abril |
Narelle Dillan | abril |
Purdie Casey | janeiro |
Donna Nell | NULO |
Blaze Graeme | Outubro |
Você deseja classificar as linhas por
birthday_month
. Solução:
SELECT * FROM birthday ORDER BY (CASE birthday_month WHEN 'January' THEN 1 WHEN 'February' THEN 2 WHEN 'March' THEN 3 WHEN 'April' THEN 4 WHEN 'May' THEN 5 WHEN 'June' THEN 6 WHEN 'July' THEN 7 WHEN 'August' THEN 8 WHEN 'September' THEN 9 WHEN 'October' THEN 10 WHEN 'November' THEN 11 WHEN 'December' THEN 12 END);
O resultado é assim (as linhas são classificadas em ordem crescente por
birthday_month
):nome | aniversário_mês |
---|---|
Purdie Casey | janeiro |
Angie Julia | abril |
Narelle Dillan | abril |
Blaze Graeme | Outubro |
Ronan Tisha | janeiro |
Dezembro | NULO |
Donna Nell | NULO |
Discussão:
Para classificar as linhas por mês, você precisa dos meses em números (não em nomes). Você pode converter nomes de meses em meses numéricos usando o
CASE WHEN
cláusula. Após o CASE
palavra-chave, especifique o nome da coluna. Então, após cada WHEN
, indique o valor nesta coluna, use o THEN
palavra-chave e especifique o novo valor que deseja atribuir em vez do antigo. Aqui, a coluna é birthday_month
, os valores atuais nesta coluna são 'January
', 'February
', …, 'December
', e os novos valores são os meses numéricos 1
, 2,
…, 12
. Depois de terminar de converter todos os valores, lembre-se de usar o END
palavra-chave para fechar o CASE WHEN
cláusula. Dê uma olhada:CASE birthday_month WHEN 'January' THEN 1 WHEN 'February' THEN 2 WHEN 'March' THEN 3 WHEN 'April' THEN 4 WHEN 'May' THEN 5 WHEN 'June' THEN 6 WHEN 'July' THEN 7 WHEN 'August' THEN 8 WHEN 'September' THEN 9 WHEN 'October' THEN 10 WHEN 'November' THEN 11 WHEN 'December' THEN 12 END
É assim que você converte um nome de mês em um número de mês. Você pode usá-lo para classificar as linhas em ordem crescente por mês - basta usá-lo no
ORDER BY
cláusula. Observe que no SQLite,
NULL
s são exibidos primeiro ao classificar em ordem crescente e por último ao classificar em ordem decrescente. Além disso, as linhas com o mesmo birthday_month
são exibidos em ordem aleatória (você pode ver Angie Julia
segundo e Narelle Dillan
terceiro, ou Narelle Dillan
segundo e Angie Julia
terceiro). Para alterar a ordem para decrescente, use o DESC
palavra-chave após a coluna no ORDER BY
cláusula. Veja como deve ser a consulta:SELECT * FROM birthday ORDER BY (CASE birthday_month WHEN 'January' THEN 1 WHEN 'February' THEN 2 WHEN 'March' THEN 3 WHEN 'April' THEN 4 WHEN 'May' THEN 5 WHEN 'June' THEN 6 WHEN 'July' THEN 7 WHEN 'August' THEN 8 WHEN 'September' THEN 9 WHEN 'October' THEN 10 WHEN 'November' THEN 11 WHEN 'December' THEN 12 END) DESC;