如何修改SQL代码实现文本字段全字符按字母优先于数字排序
如何修改SQL代码实现文本字段全字符按字母优先于数字排序
看起来你现在的问题是只处理了第一个字符的排序优先级,但需要每个字符位置都让字母排在数字前面对吧?我之前也遇到过类似的需求,给你分享一个可行的解决方案:
问题根源
SQL默认的字符串排序是按ASCII码来的,数字的ASCII码(48-57)比大写字母(65-90)小,所以默认排序里数字会排在字母前面。你需要的是每个字符位置都让字母优先,所以得构建一个自定义的排序键,让数字的「排序权重」比字母大。
解决方案(SQL Server 2017+ 推荐)
用TRANSLATE函数把所有数字字符替换成ASCII码大于字母Z(ASCII 90)的字符,这样替换后的字符串排序时,字母会自然排在数字前面,每个位置都生效。
完整修改后代码
SELECT i.tclstk FROM ( SELECT DISTINCT tclstk FROM Figaro.dbo.tccclw WITH(NOLOCK) WHERE tclrqn = '6379' AND tclbgt = 'SPC' AND tclcom <> '0.00' ) i ORDER BY -- 可选:先确保字母开头的整体排在数字开头的前面(其实下面的TRANSLATE已经包含这个逻辑) CASE WHEN LEFT(i.tclstk, 1) LIKE '[A-Z]' THEN 0 ELSE 1 END, -- 核心:替换数字为ASCII码大于Z的字符,让每个位置的字母都优先排序 TRANSLATE(i.tclstk, '0123456789', '[\]^_`{|}~')
效果验证
用你给出的测试数据,替换后的排序键如下:
- BBQ2T21 →
BBQ^T^[ - BYZKJ27 →
BYZKJ^| - B05KY35 →
B[}KY_} - B054QL9 →
B[}_QL~ - B9L57F0 →
B~L}|F[ - 0043823 →
[[_^_]`
排序这些字符串的结果正好符合你期望的顺序。
兼容低版本SQL Server(2017以下)
如果你的SQL Server版本不支持TRANSLATE,可以用嵌套REPLACE的方式实现,虽然繁琐但同样有效:
SELECT i.tclstk FROM ( SELECT DISTINCT tclstk FROM Figaro.dbo.tccclw WITH(NOLOCK) WHERE tclrqn = '6379' AND tclbgt = 'SPC' AND tclcom <> '0.00' ) i ORDER BY CASE WHEN LEFT(i.tclstk, 1) LIKE '[A-Z]' THEN 0 ELSE 1 END, REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( i.tclstk, '0', '['), '1', ']'), '2', '^'), '3', '_'), '4', '`'), '5', '{'), '6', '|'), '7', '}'), '8', '~'), '9', '')
备注:内容来源于stack exchange,提问作者E_Kelly1997
相关产品推荐
相关产品推荐

