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.