2016-09-17 112 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