对包含文本中的数字的列进行排序

时间:2014-07-11 21:20:57

标签: sql sql-server

我在SQL Server 2008中有一个包含字母和数字的nvarchar(500)列,这是我在SQL Server中使用ORDER BY子句时的数据...

env
guide
Seg 18 - NWS
Seg 19  - NWS
Seg 1A - ECC
Seg 1B - ECC
Seg 22 - xxx
Seg 23 - GL
Seg 3- GL
Seg 4 - GL
Utils

但我想得到这个结果......

env
guide
Seg 1A - ECC
Seg 1B - ECC
Seg 3- GL
Seg 4 - GL
Seg 18 - NWS
Seg 19  - NWS
Seg 22 - xxx
Seg 23 - GL
Utils

有什么建议吗?

3 个答案:

答案 0 :(得分:0)

这被称为自然排序,如果您不拥有数据库,那将成为您的噩梦。您可以按照响应here进行操作,这似乎非常强大,但需要在CLR中注入新功能。

正如其中一位评论者建议您可以对3列进行拆分然后排序,但如果您的文本不是固定宽度,则可能会遇到更多问题并导致最终的hacky解决方案。 This is a decent T-SQL solution you can try但它依赖于固定宽度...更多人suggest填充您的数字。

你还想要什么?你有没有尝试过并找到那些想要的人?

答案 1 :(得分:0)

首先,我假设你的模式中只有一个数字。如果没有,您可以扩展下面的代码,假设您有一些已知的规则来检测正确的字符串。

所以,下面这个代码(我目前还没有任何机器可以测试...)找到数字起始索引和长度,提取它并将其转换为整数(我假设字符串在一个整数内)名为@data}的变量:

DECLARE @numindex int;
SELECT @numindex = PATINDEX('[0-9]', @data);
DECLARE @numlength int;
SELECT @numlength = PATINDEX('[^0-9]', SUBSTRING(@data, @numindex, LEN(DATA) - @numindex - 1));
-- This is the result below
SELECT CONVERT(int, SUBSTRING(@data, @numindex, @numlength))

如果我写的所有假设都适合你,你可以从中创建一个标量值函数,或者直接将它添加到查询中(这可能会使查询有点不可读......)。

关于性能,在每个查询中对此进行排序显然并不理想。如果这种情况发生很多并且数据不会经常变化,那么创建一个可能被缓存的视图会提高性能。

答案 2 :(得分:-2)

这是一种方法,假设您发布的唯一数字值。如果后缀也可能包含数字,则需要稍微调整一下。我正在使用由Dwain Camps在sql server central创建的超级棒内联表值函数。我知道这个网站需要登录,但它是免费的,这种技术非常值得注册。

http://www.sqlservercentral.com/articles/String+Manipulation/94365/

使用他的功能非常简单。这是100%基于设置。没有循环,而根本没有游标。

declare @Table table (SomeValue varchar(25))

insert @Table
select 'Seg 1A - ECC' union all
select 'Seg 1B - ECC' union all
select 'Seg 3- GL' union all
select 'Seg 4 - GL' union all
select 'Seg 18 - NWS' union all
select 'Seg 19  - NWS' union all
select 'Seg 22 - xxx' union all
select 'Seg 23 - GL'

select t.*
from @Table t
outer apply dbo.PatternSplitCM(t.SomeValue, '[%0-9%]') x
where x.Matched = 1
order by x.Matched desc, Item