复杂的字段"字符串 - 数字 - 字符串"

时间:2014-03-17 17:49:01

标签: sql sql-server sql-server-2008 tsql natural-sort

基本上,我正在尝试按名称对表进行排序。该表相对较大,但为了示例,我只发布了一列。列位于

下方
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之后还有电台列表。

2 个答案:

答案 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的可变大小的子组件进行排序既不快也不容易。