有一个我要排序的列
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)
答案 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-SI
或1719-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')
将三个部分存储在三个不同类型的列中,应用索引并在运行中创建输出格式。您不应该在单元格中存储多个值...