PostgreSQL多列排序:首列升序,次列为空/0的行后置
解决PostgreSQL多列排序问题:将monies为NULL/0的行置于末尾
我来帮你搞定这个排序需求!你的目标是对user表先按username字母升序排列,但要把monies字段为NULL或者0的行放到所有有效数据行的后面对吧?咱们一步步来修正你的SQL。
问题分析
你原来的SQL有两个关键问题:
- 字段名错误:你用了
name,但表中实际字段是username; - 只处理了NULL值的位置,没有把
monies=0的行也归到末尾,所以达不到预期效果。
正确的SQL语句
要实现需求,我们可以用CASE表达式先把数据分成两组(有效monies组和无效组),让有效组排在前面,然后每组内按username升序排序:
SELECT * FROM "user" ORDER BY -- 第一排序条件:标记无效行(NULL或0)为1,有效行为0,让有效行在前 CASE WHEN monies IS NULL OR monies = 0 THEN 1 ELSE 0 END ASC, -- 第二排序条件:每组内按username字母升序排列 username ASC;
验证结果
运行这个SQL后,结果会和你期望的完全一致:
username monies zip allan 12 34333 jim 25 87888 will 4 88788 abel null 87888 adrian 0 97677
可选扩展:如果有效组内需要按monies排序
要是你希望有效组内除了按username排序,还想按monies排序(比如降序),可以再加一个排序条件:
SELECT * FROM "user" ORDER BY CASE WHEN monies IS NULL OR monies = 0 THEN 1 ELSE 0 END ASC, username ASC, monies DESC; -- 有效组内按monies降序排列
内容的提问来源于stack exchange,提问作者Jimski
相关产品推荐
相关产品推荐

