如何按提取子串的CASE语句结果对SQL查询排序?
按CASE语句输出结果排序的解决方案
你写的SQL其实已经能实现按StrippedName排序的需求,不过有几个细节需要注意,同时可以优化代码的复用性:
1. 原始写法的有效性
当前SQL里直接在ORDER BY里用别名StrippedName是可行的,大部分主流数据库(比如PostgreSQL、MySQL、SQL Server)都支持在排序时引用SELECT子句定义的列别名。
需要留意两个点:
- 字符串函数的数据库兼容性:比如MySQL里没有
strpos,要用LOCATE;SQL Server里substr要写成SUBSTRING,如果运行报错,得换成对应数据库支持的函数。 - 字符串索引起始值:像PostgreSQL这类数据库,
substr的起始索引是1而不是0,这时候要把substr("Name", 0, ...)改成substr("Name", 1, ...),不然会漏掉第一个字符。
2. 优化写法(避免重复写CASE逻辑)
如果觉得重复写CASE块太冗余,可以用子查询或者CTE封装计算逻辑,让代码更清晰:
子查询写法
SELECT StrippedName FROM ( SELECT CASE WHEN strpos("Name", ' ') > 0 THEN substr("Name", 1, strpos("Name", ' ') - 1) WHEN strpos("Name", '-') > 0 THEN substr("Name", 1, strpos("Name", '-') - 1) ELSE "Name" END AS StrippedName FROM myTable ) AS sub ORDER BY StrippedName;
CTE写法(适合支持WITH子句的数据库)
WITH NameStripped AS ( SELECT CASE WHEN strpos("Name", ' ') > 0 THEN substr("Name", 1, strpos("Name", ' ') - 1) WHEN strpos("Name", '-') > 0 THEN substr("Name", 1, strpos("Name", '-') - 1) ELSE "Name" END AS StrippedName FROM myTable ) SELECT StrippedName FROM NameStripped ORDER BY StrippedName;
3. 额外注意事项
- 字段名的引号要符合数据库规范:有的数据库用双引号区分大小写/特殊字段名,有的用反引号,根据你的数据库调整。
- 如果
Name字段可能为空,建议加NULL判断,防止函数执行报错。
内容的提问来源于stack exchange,提问作者Jon
相关产品推荐
相关产品推荐

