在SQL Server中对含数字的字符串列实现正确排序的方法
问题描述
我有一个存储如下格式字符串的列:
| column name |
|---|
| 14 / 21 / 28 days |
| 28 / 35 / 42 days |
| 30 / 60 / 90 days |
| 7 days |
尝试执行以下SQL语句排序:
SELECT column_name FROM mytable ORDER BY column_name
但未能得到预期结果,希望在SQL Server中实现如下排序效果:
| column name |
|---|
| 7 days |
| 14 / 21 / 28 days |
| 21 / 30 / 60 days |
| 28 / 35 / 42 days |
| 30 / 60 / 90 days |
解决方案
直接对字符串列排序会按字符ASCII码顺序比较,导致"14 days"排在"7 days"前(因为'1'的ASCII值小于'7')。要实现预期的数值排序,需提取字符串中的第一个数字并转为数值类型作为排序依据:
方法1:针对统一格式的快速解法
如果所有数据格式都是"数字 + 空格 + 其他内容",可以用以下语句:
SELECT column_name FROM mytable ORDER BY TRY_CAST(LEFT(column_name, CHARINDEX(' ', column_name) - 1) AS INT) ASC
CHARINDEX(' ', column_name)定位第一个空格的位置,确定数字部分的结束点LEFT截取空格前的数字字符串TRY_CAST将字符串转为整数,按数值大小升序排序
方法2:通用兼容解法
如果存在格式不统一的情况(比如部分值无空格、数字前有其他字符),可以用正则匹配定位数字:
SELECT column_name FROM mytable ORDER BY TRY_CAST( SUBSTRING( column_name, PATINDEX('%[0-9]%', column_name), PATINDEX('%[^0-9]%', SUBSTRING(column_name, PATINDEX('%[0-9]%', column_name), LEN(column_name))) - 1 ) AS INT ) ASC
这个方法会先找到字符串中第一个数字的起始位置,再找到后续第一个非数字的位置,截取中间的连续数字转为整数排序,兼容性更强。
内容的提问来源于stack exchange,提问作者Dolla
相关产品推荐
相关产品推荐

