基本上,我试着按一个表的名字排序。这张表比较大,但为了举例,我只张贴了一栏。列在下面的车站
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分类为108。我需要它在EPA 108井和EPA 109井之间,我尝试了许多不同的方法。
此外,加油站的名单在EPA之后还在继续。
发布于 2014-03-18 09:44:28
这个解决方案比选择的答案更可靠。这个答案可能不会给出预期的答案,如果有超过一个数字,如'EPA井57‘站。这个解决方案是用'0's填充数字,所以比较将考虑所有数字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的答案不会在我的测试数据中给出正确的顺序。
发布于 2014-03-17 18:08:05
我需要它在EPA 108井和EPA 109井之间
然后不是按名称对其进行排序;而是通过单独的子组件对其进行排序,这些子组件也恰好包含在name列中,但顺序不同。您必须为每个子组件创建列并按子组件进行排序:
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子句,例如:
ORDER BY sc1, sc2, sc3如果要避免重复数据,请删除Name列并从子组件中组装显示名称:
SELECT sc1 + ' ' + Convert(VarChar, sc2) + sc3 AS Name在运行时快速而容易地生成一个名称。在运行时按VarChar的可变大小的子组件排序既不快也不容易。
https://stackoverflow.com/questions/22461619
复制相似问题