SQLite
 sql >> Base de Dados >  >> RDS >> SQLite

Como ordenar por nome de mês no SQLite

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;