我有以下SQL:
SELECT fldTitle
FROM tblTrafficAlerts
ORDER BY fldTitle它按照以下顺序返回结果(来自NVARCHAR列):
A1M northbound within J17 Congestion
M1 J19 southbound exit Congestion
M1 southbound between J2 and J1 Congestion
M23 northbound between J8 and J7 Congestion
M25 anti-clockwise between J13 and J12 Congestion
M25 clockwise between J8 and J9 Broken down vehicle
M3 eastbound at the Fleet services between J5 and J4A Congestion
M4 J19 westbound exit Congestion您将看到M23和M25列在M3和M4行的前面,这看上去并不令人愉快,如果扫描更长的结果列表,您就不会按这个顺序阅读它们。
因此,我希望按字母顺序排列结果,然后按数字排序,如下所示:
A1M northbound within J17 Congestion
M1 J19 southbound exit Congestion
M1 southbound between J2 and J1 Congestion
M3 eastbound at the Fleet services between J5 and J4A Congestion
M4 J19 westbound exit Congestion
M23 northbound between J8 and J7 Congestion
M25 anti-clockwise between J13 and J12 Congestion
M25 clockwise between J8 and J9 Broken down vehicle因此,M3和M4出现在M23和M25之上。
发布于 2016-01-20 10:42:46
这个应该可以处理。还添加了一些奇怪的数据,以确保排序也适用于此:
SELECT x
FROM
(values
('A1M northbound within J17 Congestion'),
('M1 J19 southbound exit Congestion'),
('M1 southbound between J2 and J1 Congestion'),
('M23 northbound between J8 and J7 Congestion'),
('M25 anti-clockwise between J13 and J12 Congestion'),
('M25 clockwise between J8 and J9 Broken down vehicle'),
('M3 eastbound at the Fleet services between J5 and J4A Congestion'),
('M4 J19 westbound exit Congestion'),('x'), ('2'), ('x2')) x(x)
ORDER BY
LEFT(x, patindex('%_[0-9]%', x +'0')),
0 + STUFF(LEFT(x,
PATINDEX('%[0-9][^0-9]%', x + 'x1x')),1,
PATINDEX('%_[0-9]%', x + '0'),'')结果:
2
A1M northbound within J17 Congestion
M1 J19 southbound exit Congestion
M1 southbound between J2 and J1 Congestion
M3 eastbound at the Fleet services between J5 and J4A Congestion
M4 J19 westbound exit Congestion
M23 northbound between J8 and J7 Congestion
M25 anti-clockwise between J13 and J12 Congestion
M25 clockwise between J8 and J9 Broken down vehicle
x
x2发布于 2016-01-20 10:07:40
也许这并不漂亮,但它确实奏效了:
DECLARE @tblTrafficAlerts TABLE
(
fldTitle NVARCHAR(500)
);
INSERT INTO @tblTrafficAlerts (fldTitle)
VALUES (N'A1M northbound within J17 Congestion')
, (N'M1 J19 southbound exit Congestion')
, (N'M1 southbound between J2 and J1 Congestion')
, (N'M23 northbound between J8 and J7 Congestion')
, (N'M25 anti-clockwise between J13 and J12 Congestion')
, (N'M25 clockwise between J8 and J9 Broken down vehicle')
, (N'M3 eastbound at the Fleet services between J5 and J4A Congestion')
, (N'M4 J19 westbound exit Congestion');
SELECT *
FROM @tblTrafficAlerts AS T
CROSS APPLY (SELECT PATINDEX('%[0-9]%', T.fldTitle)) AS N(NumIndex)
CROSS APPLY (SELECT PATINDEX('%[0-9][^0-9]%', T.fldTitle)) AS NN(NextLetter)
ORDER BY SUBSTRING(T.fldTitle, 0, N.NumIndex), CONVERT(INT, SUBSTRING(T.fldTitle, N.NumIndex, NN.NextLetter - 1));这将提取第一个数字之前的所有内容,按其排序,然后将该数字和顺序提取为整数。
这就是输出:
╔══════════════════════════════════════════════════════════════════╗
║ fldTitle ║
╠══════════════════════════════════════════════════════════════════╣
║ A1M northbound within J17 Congestion ║
║ M1 J19 southbound exit Congestion ║
║ M1 southbound between J2 and J1 Congestion ║
║ M3 eastbound at the Fleet services between J5 and J4A Congestion ║
║ M4 J19 westbound exit Congestion ║
║ M23 northbound between J8 and J7 Congestion ║
║ M25 anti-clockwise between J13 and J12 Congestion ║
║ M25 clockwise between J8 and J9 Broken down vehicle ║
╚══════════════════════════════════════════════════════════════════╝发布于 2016-01-20 10:09:22
SELECT fldTitle FROM tblTrafficAlerts order by LEFT(fldTitle , CHARINDEX(' ', fldTitle) - 1), fldTitle 或者使用平索引
ORDER BY LEFT(Col1,PATINDEX('%[^0-9]%',Col1)-1)https://stackoverflow.com/questions/34896793
复制相似问题