问题发现:sql使用order by排序,发现升序字段为空值的在最上边
问题解决:利用order by多个参数规则,使用case when then提前排序
- 将数据分为字段为空值或者为空的数据和字段不为空的数据
- 将两种数据排序,空的数据放最底部
- 再次根据字段进行升降序排序
sql示例:
SELECT * FROM myTable
ORDER BY
CASE
WHEN table_question IS NULL OR table_question = '' THEN 1
ELSE 0
END ASC,
table_question DESC
示例数据:
id | table_question |
---|---|
1 | 10 |
2 | 2 |
3 | NULL |
4 | 20 |
5 | 100 |
6 | “” |
执行上述 SQL 语句后的排序结果:
id | table_question |
---|---|
5 | 100 |
4 | 20 |
1 | 10 |
2 | 2 |
3 | NULL |
6 | “” |
解释步骤
- 辅助列生成:id 为 1, 2, 4, 5 的记录的辅助列值为 0(table_question 不为空且不为 NULL); id 为 3, 6 的记录的辅助列值为 1(table_question 为空或为 NULL)
- 按照辅助列排序:辅助列值为 0 的记录排在前面:id 为 1, 2, 4, 5。
辅助列值为 1 的记录排在后面:id 为 3, 6。 - 在辅助列相同的情况下按 table_question 降序排序:辅助列值为 0 的记录按 table_question 降序排序:id 为 5, 4, 1, 2。辅助列值为 1 的记录顺序保持不变:id 为 3, 6。
这样就实现了在排序时,将 table_question 为空或为 NULL 的记录放在末尾的效果,同时对非空记录按 table_question 降序排序。