如何实现SQL查询按字母排序并忽略括号?
解决SQL排序时忽略括号的问题
嗨,这个问题我之前处理过,原因很简单:括号()的ASCII码比小写字母a要小,所以直接用ORDER BY name排序时,带括号的字符串会排在字母开头的内容前面。要实现你想要的abc (stu) suv排序效果,核心思路是基于去掉括号后的字符串来排序,同时保留原字段的显示格式。
下面是不同主流数据库的具体实现方案:
MySQL/MariaDB
用两次REPLACE函数分别移除左括号和右括号,再基于处理后的结果排序:SELECT name FROM table1 ORDER BY REPLACE(REPLACE(name, '(', ''), ')', '');PostgreSQL
除了和MySQL一样用两次REPLACE,还可以用正则替换函数REGEXP_REPLACE一次性清除所有括号,写法更简洁:-- 两次REPLACE写法 SELECT name FROM table1 ORDER BY REPLACE(REPLACE(name, '(', ''), ')', ''); -- 正则替换写法 SELECT name FROM table1 ORDER BY REGEXP_REPLACE(name, '[()]', '', 'g');这里的
'[()]'是正则表达式,匹配左括号或右括号,'g'参数表示全局替换所有匹配的字符。SQL Server
同样可以用两次REPLACE函数实现需求:SELECT name FROM table1 ORDER BY REPLACE(REPLACE(name, '(', ''), ')', '');如果你用的是SQL Server 2017及以上版本,也可以尝试
TRANSLATE函数,但注意它只能将字符替换为其他字符(不能直接替换为空),所以还是两次REPLACE的方案更直接可靠。
这样执行后,查询返回的name字段会保留原始的带括号格式,但排序逻辑会忽略括号,正好得到你期望的abc (stu) suv排序结果。
内容的提问来源于stack exchange,提问作者Renan Aguiar
相关产品推荐
相关产品推荐

