2016-09-17 272 views
1

我要排序该列包含数字和字母数字值的值。SQL混合数字和字母数字值的排序

但我得到了错误的排序(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 

OUTPUT:

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

可能的重复[SQL Server 2008 - 按数字字符串排序](http://stackoverflow.com/questions/20240313/sql-server-2008-order-by-strings-with-number-numerically) – hatchet

+0

此外,如果重复问题的答案很难遵循,那么有:http://www.essentialsql.com/use-sql-server-to-sort-alphanumeric-values/ – hatchet

+0

@hatchet,但我有多个在我的列中分隔分号的值“;” – itsMacyAnn

回答

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) 

主要的想法是让分离的字母和数字,比使用CAST让他们整数和排序的字母第一比整数。

+0

它的工作原理!非常感谢 ! :)) – itsMacyAnn