SQL排序问题:如何让priority>0的记录排在查询结果前列?
解决SQL排序优先级问题
问题核心是要先把prioridade > 0的记录放在最前面,再分别执行各自的排序规则。原SQL的问题在于,当prioridade = 0时,CASE表达式返回NULL,而大多数数据库中NULL在升序排序里会排在非NULL值之前,导致这部分记录跑到了前面。
调整方案是在ORDER BY里新增一个分组排序项,明确区分两类记录的先后顺序:
SELECT * FROM registros ORDER BY -- 让prioridade>0的记录排在前面,=0的排在后面 CASE WHEN prioridade > 0 THEN 0 ELSE 1 END ASC, -- 对prioridade>0的记录按prioridade升序排序 CASE WHEN prioridade > 0 THEN prioridade END ASC, -- 对prioridade=0的记录按id降序排序,同时不影响前一类记录的排序 id DESC
逻辑说明:
- 第一个CASE表达式:给
prioridade>0的记录标记为0,prioridade=0的标记为1,升序排序后0组自然排在1组前面。 - 第二个CASE表达式:仅对
prioridade>0的记录按prioridade升序排列,prioridade=0的记录在此项上返回NULL,不影响它们的相对顺序(由第三个排序项决定)。 - 第三个排序项
id DESC:对prioridade=0的记录按id降序排列,而prioridade>0的记录已经由第二个排序项排好,此项不会打乱它们的顺序。
内容的提问来源于stack exchange,提问作者Leandro San.
相关产品推荐
相关产品推荐

