SQL使用ORDER BY实现多条件排序:自定义域优先级+特殊字符后置
解决方案
在ORDER BY子句最前面新增domain字段的自定义优先级规则作为第一排序键,保留你已实现的name排序逻辑作为第二排序键即可。SQL的ORDER BY按书写顺序从左到右判定排序优先级,左侧排序键优先级始终高于右侧,刚好匹配两层排序的需求。
排序逻辑拆解
- 第一层级(domain自定义分层):通过
CASE WHEN给不同domain映射从小到大的数值权重,数值越小排序位置越靠前:- domain值为
yahoo映射权重0,优先展示 - domain值为
gmail映射权重1,次位展示 - 其余所有domain统一映射权重2,放在最后
- domain值为
- 第二层级(分层内name排序):直接复用你已验证过的逻辑:以英文字母开头的name按不区分大小写的字母序排序;特殊字符开头的name前拼接
~(该字符ASCII码大于所有英文字母),自动排在同分层末尾。
最终SQL代码
SELECT * FROM table1 ORDER BY -- 第一排序键:domain自定义优先级 CASE WHEN domain = 'yahoo' THEN 0 WHEN domain = 'gmail' THEN 1 ELSE 2 END, -- 第二排序键:分层内name排序规则 CASE WHEN name GLOB '[A-Za-z]*' THEN name ELSE '~' || name END COLLATE NOCASE;
如果表中domain存在大小写混合存储的情况(例如
Yahoo/GMAIL),可以在domain匹配条件后加COLLATE NOCASE保证匹配准确,例如将判断条件写为WHEN domain = 'yahoo' COLLATE NOCASE THEN 0即可。
内容的提问来源于stack exchange,提问作者DCoder
相关产品推荐
相关产品推荐

