PostgreSQL如何实现先按全大写优先、再按字母顺序排序?
PostgreSQL 自定义大小写优先级排序实现
要实现你需要的三级优先级排序规则,可通过在ORDER BY子句中新增多个自定义排序维度实现,具体方案如下:
实现思路
三个排序维度按优先级从高到低排列:
- 第一维度:判断字符串是否为全大写,全大写的记录优先级更高
- 第二维度:判断首字母是否为大写,首字母大写的记录优先级高于全小写记录
- 第三维度:统一转为小写后按字母顺序升序排列,保证同类型记录的字母排序正确
最终SQL语句
SELECT * FROM users ORDER BY -- 全大写优先排序 (name = upper(name)) DESC, -- 首字母大写次之 (left(name, 1) = upper(left(name, 1))) DESC, -- 最后按字母顺序排序 lower(name) ASC;
排序效果
执行上述语句后,将直接得到你期望的理想排序结果:
AVA
JESSICA
Adam
James
John
adrian
扩展适配(可选)
如果你的场景中存在部分中间字符大写的记录(例如aDRian),希望大写字符数量越多优先级越高,可在第二、第三维度之间增加如下排序规则:
-- 大写字符数量多的优先 (length(name) - length(regexp_replace(name, '[A-Z]', '', 'g'))) DESC
内容的提问来源于stack exchange,提问作者Tomasz
相关产品推荐
相关产品推荐

