SQL 混合数字和字母数字值排序
SQL Sort of mixed numbers and alphanumeric Value
我要对包含数字值和字母数字值的列进行排序。
但我的排序有误 (order by
) 谁能帮我解决这个问题?
我正在使用 SQL SERVER 2008 R2,示例如下:
DECLARE @TableTester TABLE (TESTER VARCHAR(50));
INSERT @TableTester VALUES
('1'),
('2'),
('3'),
('4'),
('10'),
('20'),
('5 ; 6'),
('122'),
('256 ; 78'),
('U1 ; U2'),
('U3 ; 7'),
('C1'),
('U4'),
('WC23'),
('WC214 ; U4'),
('U10');
SELECT Tester FROM @TableTester
ORDER BY CASE WHEN PATINDEX('%[0-9]%', Tester) > 0 THEN 0 ELSE 1 END,
CASE WHEN PATINDEX('%[0-9]%', Tester) > 0
THEN LEFT(Tester, PATINDEX('%[0-9]%', Tester)-1) ELSE Tester END
输出:
1
2
3
4
10
20
5 ; 6
122
256 ; 78
C1
U4
U10
U1 ; U2
U3 ; 7
WC23
WC214 ; U4
期望的结果:
1
2
3
4
5 ; 6
10
20
122
256 ; 78
C1
U1 ; U2
U3 ; 7
U4
U10
WC23
WC214 ; U4
再次规范化您的数据 - 这种排序很奇怪:
SELECT TESTER
FROM @TableTester
ORDER BY
CASE WHEN TESTER LIKE '[A-Z]%' THEN LEFT(TESTER,PATINDEX('%[0-9]%',TESTER)-1) ELSE NULL END,
CAST(
CASE WHEN TESTER LIKE '%[0-9]%'
THEN REPLACE(SUBSTRING(TESTER,PATINDEX('%[0-9]%',TESTER),CHARINDEX(' ;',TESTER+' ;')-1),' ;','')
ELSE TESTER END
as int)
主要思想是将字母和数字分开,然后使用转换使它们成为整数,并先按字母而不是整数排序。
我要对包含数字值和字母数字值的列进行排序。
但我的排序有误 (order by
) 谁能帮我解决这个问题?
我正在使用 SQL SERVER 2008 R2,示例如下:
DECLARE @TableTester TABLE (TESTER VARCHAR(50));
INSERT @TableTester VALUES
('1'),
('2'),
('3'),
('4'),
('10'),
('20'),
('5 ; 6'),
('122'),
('256 ; 78'),
('U1 ; U2'),
('U3 ; 7'),
('C1'),
('U4'),
('WC23'),
('WC214 ; U4'),
('U10');
SELECT Tester FROM @TableTester
ORDER BY CASE WHEN PATINDEX('%[0-9]%', Tester) > 0 THEN 0 ELSE 1 END,
CASE WHEN PATINDEX('%[0-9]%', Tester) > 0
THEN LEFT(Tester, PATINDEX('%[0-9]%', Tester)-1) ELSE Tester END
输出:
1
2
3
4
10
20
5 ; 6
122
256 ; 78
C1
U4
U10
U1 ; U2
U3 ; 7
WC23
WC214 ; U4
期望的结果:
1
2
3
4
5 ; 6
10
20
122
256 ; 78
C1
U1 ; U2
U3 ; 7
U4
U10
WC23
WC214 ; U4
再次规范化您的数据 - 这种排序很奇怪:
SELECT TESTER
FROM @TableTester
ORDER BY
CASE WHEN TESTER LIKE '[A-Z]%' THEN LEFT(TESTER,PATINDEX('%[0-9]%',TESTER)-1) ELSE NULL END,
CAST(
CASE WHEN TESTER LIKE '%[0-9]%'
THEN REPLACE(SUBSTRING(TESTER,PATINDEX('%[0-9]%',TESTER),CHARINDEX(' ;',TESTER+' ;')-1),' ;','')
ELSE TESTER END
as int)
主要思想是将字母和数字分开,然后使用转换使它们成为整数,并先按字母而不是整数排序。