SQL排序的混合数字和字母数字值

时间:2016-09-17 03:48:19

标签: sql sql-server tsql sql-server-2008-r2 sql-order-by

我要对该列进行排序,其中包含数字和字母数字值。

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

1 个答案:

答案 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)

主要思想是将字母和数字分开,然后使用强制转换使它们成为整数,首先按字母排序,而不是按整数排序。