Problema:
Você deseja classificar as linhas por data.
Exemplo 1:
O
exam
tabela tem duas colunas, subject
e exam_date
. assunto | exam_date |
---|---|
Matemática | 2019-12-19 |
Inglês | 2020-01-08 |
Ciência | 2020-01-05 |
Saúde | 2020-01-05 |
Arte | NULO |
Você deseja classificar as linhas por
exam_date
. Solução:
SELECT * FROM exam ORDER BY exam_date;
O resultado é assim (as linhas são classificadas em ordem crescente por
exam_date
):Assunto | Data do exame |
---|---|
Arte | NULO |
Matemática | 2019-12-19 |
Ciência | 2020-01-05 |
Saúde | 2020-01-05 |
Inglês | 2020-01-08 |
Discussão:
Use o
ORDER BY
palavra-chave e o nome da coluna pela qual você deseja classificar. Dessa forma, você classificará os dados em ordem crescente por esta coluna. Você também pode usar o ASC
palavra-chave para deixar claro que a ordem é crescente (a data mais antiga é exibida primeiro, a data mais recente é exibida por último etc.). SELECT * FROM exam ORDER BY exam_date ASC;
Se você quiser ver a data mais recente primeiro e a data mais antiga por último, será necessário classificar em ordem decrescente. Use o
DESC
palavra-chave neste caso. SELECT * FROM exam ORDER BY exam_date DESC;
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 exam_date
são exibidos em ordem aleatória (você pode ver Science
segundo e Health
terceiro, ou Health
segundo e Science
terceiro). Exemplo 2:
O
exam
tabela tem as seguintes colunas:subject
, exam_year
, exam_month
e exam_day
. Os meses são dados em nomes, não em números. assunto | exam_year | exam_month | exam_day |
---|---|---|---|
Matemática | 2019 | Dezembro | 19 |
Inglês | 2020 | janeiro | 8 |
Ciência | 2020 | janeiro | 5 |
Saúde | 2020 | janeiro | 5 |
Arte | NULO | NULO | NULO |
Solução:
SELECT * FROM exam ORDER BY exam_year, (CASE exam_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), exam_day;
O resultado é assim (as linhas são classificadas em ordem crescente por
exam_year
, exam_month
e exam_day
):assunto | exam_year | exam_month | exam_day |
---|---|---|---|
Arte | NULO | NULO | NULO |
Matemática | 2019 | Dezembro | 19 |
Saúde | 2020 | janeiro | 5 |
Ciência | 2020 | janeiro | 5 |
Inglês | 2020 | janeiro | 8 |
Discussão:
Para classificar as linhas por data de exame, você precisa classificar primeiro por ano, depois por mês numérico (não pelo nome do mês) e, finalmente, por dia. Você pode converter nomes de meses em meses numéricos com um
CASE WHEN
cláusula. Após o CASE
palavra-chave, especifique o nome da coluna. Em seguida, após cada WHEN, indique o valor nesta coluna, use a palavra-chave THEN e especifique o novo valor que deseja atribuir em vez do antigo. Aqui, a coluna é exam_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 exam_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 ao classificar as linhas por data, ou seja, por ano, mês numérico e dia.
ORDER BY exam_year, (CASE exam_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), exam_day
Dessa forma, você pode classificar as linhas em ordem crescente por data. O
NULL
s será exibido primeiro. Para alterar a ordem para decrescente, use o DESC
palavra-chave após cada coluna no ORDER BY
cláusula. Veja como toda a consulta deve ser:SELECT * FROM exam ORDER BY exam_year DESC, (CASE exam_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, exam_day DESC;
Observe que ao classificar em ordem decrescente no SQLite,
NULL
s são exibidos por último.