我要对该列进行排序,其中包含数字和字母数字值。
但是我得到了错误的排序(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
答案 0 :(得分:1)
再一次,规范化您的数据 - 这种排序很奇怪:
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)
主要思想是将字母和数字分开,然后使用强制转换使它们成为整数,首先按字母排序,而不是按整数排序。