基本上,我正在尝试按名称对表进行排序。该表相对较大,但为了示例,我只发布了一列。列位于
下方Station
===
ANTIL WELL 1
ANTIL WELL 2
BASELINE & CALIFORNIA WELL
EPA WELL 6
EPA WELL 7
EPA WELL 108
EPA WELL 109
EPA WELL 110
EPA WELL 111
EPA WELL 112
EPA WELL 108S
上面这种情况是我尝试这样做的:
order by left(station,LEN(station) -PATINDEX('%[^0-9]%',REVERSE(station))+1)
,CONVERT(int,REVERSE(LEFT(REVERSE(station), PATINDEX('%[^0-9]%',REVERSE(station)) - 1)))
但是,我无法对EPA WELL 108S进行排序。我需要它介于EPA WELL 108和EPA WELL 109之间,我尝试了很多不同的方式。
EPA之后还有电台列表。
答案 0 :(得分:2)
此解决方案比选择的答案更可靠。如果站内有超过1个号码,如“EPA WELL 5 7”,则此答案可能无法给出预期答案。这个解决方案是用'0'填充数字,所以比较将考虑所有数字8位数。
DECLARE @Table1 table([station] varchar(26))
INSERT INTO @Table1
([station])
VALUES
('ANTIL WELL 2'),
('ANTIL WELL 1'),
('BASELINE & CALIFORNIA WELL'),
('EPA WELL 7'),
('EPA WELL 6'),
('EPA WELL 108'),
('EPA WELL 109'),
('EPA WELL 110'),
('EPA WELL 111'),
('EPA WELL 112'),
('EPA WELL 108S'),
('EPA WELL 111108')
;
SELECT station
FROM @table1
ORDER BY
CASE WHEN station not like '%[0-9]%' THEN station ELSE
STUFF(station, PATINDEX('%[0-9]%',station), 0, replicate('0',
PATINDEX('%[0-9]%',station) - len(station) + PATINDEX('%[0-9]%',reverse(station)) + 6))
END
* GoatCD的回答不会在我的测试数据中给出正确的顺序。
答案 1 :(得分:1)
我需要它介于EPA WELL 108和EPA WELL 109之间
然后你没有按名字排序;您正在通过单独的子组件对其进行排序,这些子组件也恰好包含在名称列中,但顺序不同。您必须为每个子组件创建列并按子组件排序:
Name sc1 sc2 sc3
EPA WELL 108 EPA WELL 108
EPA WELL 6 EPA WELL 6
EPA WELL 7 EPA WELL 7
EPA WELL 109 EPA WELL 109
EPA WELL 108s EPA WELL 108 s
然后你可以使用ORDER BY子句,如:
ORDER BY sc1, sc2, sc3
如果要避免重复数据,请删除“名称”列并从子组件中组合显示名称:
SELECT sc1 + ' ' + Convert(VarChar, sc2) + sc3 AS Name
在运行时快速轻松地创建名称。在运行时通过VarChar的可变大小的子组件进行排序既不快也不容易。