按正则表达式排序

时间:2017-07-17 09:42:23

标签: sql sql-server view sql-order-by

有一个我要排序的列

C_NUMBER
---------
1718-SI-1
1718-SI-2
1718-SI-10
1718-SI-13
1718-SI-5
1718-SI-6
1718-SI-11

这是我将数据放在一个表中并按顺序应用但不起作用的查询。

MYTABLE order by MYTABLE.C_NUMBER asc, patindex('%0-9]%',MYTABLE.C_NUMBER),len(MYTABLE.C_NUMBER)

3 个答案:

答案 0 :(得分:0)

我认为你不想先通过C_NUMBER订购,只需要你的patindex部分。试试这个;

order by patindex('%0-9]%',MYTABLE.C_NUMBER),len(MYTABLE.C_NUMBER)

答案 1 :(得分:0)

试试这个

;With cte(C_NUMBER)
AS
(
SELECT '1718-SI-1'   UNION ALL
SELECT '1718-SI-2'  UNION ALL
SELECT '1718-SI-10' UNION ALL
SELECT '1718-SI-13' UNION ALL
SELECT '1718-SI-5'  UNION ALL
SELECT '1718-SI-6'  UNION ALL
SELECT '1718-SI-11'
)
SELECT * FROM cte
Order by  CAST(REVERSE(SUBSTRING(REVERSE(C_NUMBER),0, CHARINDEX('-',REVERSE(C_NUMBER)))) AS INT) 

结果

C_NUMBER
----------
1718-SI-1
1718-SI-2
1718-SI-5
1718-SI-6
1718-SI-10
1718-SI-11
1718-SI-13

答案 2 :(得分:0)

此代码将分三部分剪切字符串,并分别在ORDER BY子句中使用这些值 - typesafe !! 。这将对不同的1718-SI1719-BI或您可能拥有的任何内容进行排序。

DECLARE @mockup TABLE(ID INT IDENTITY, C_NUMBER VARCHAR(100));
INSERT INTO @mockup VALUES
('1718-SI-1')
,('1718-SI-2')
,('1718-SI-10')
,('1718-SI-13')
,('1718-SI-5')
,('1718-SI-6')
,('1718-SI-11');

SELECT * FROM @mockup;

SELECT m.*
FROM @mockup AS m
CROSS APPLY(SELECT CAST('<x>' + REPLACE(m.C_NUMBER,'-','</x><x>') + '</x>' AS XML)) AS Parted(AsXML)
ORDER BY AsXML.value('/x[1]/text()[1]','int')
        ,AsXML.value('/x[2]/text()[1]','nvarchar(max)')
        ,AsXML.value('/x[3]/text()[1]','int')        

提示:您的设计中断 1.NF

将三个部分存储在三个不同类型的列中,应用索引并在运行中创建输出格式。您不应该在单元格中存储多个值...