sql-server – SQL Server 2008 – 按数字顺序排列字符串

前端之家收集整理的这篇文章主要介绍了sql-server – SQL Server 2008 – 按数字顺序排列字符串前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我的表中有以下值:
ABC
ABC1
ABC2
ABC3 and so on...

ABC11
ABC12
ABC13 and so on..

ABC20
ABC21
ABC22 and so on..

所以基本上我有的是任何字符串值(不总是ABC,任何字符串值),可以跟随数字,或者它可能只是一个没有数字的字符串.

当我从列表中选择*从我的列asc我得到以下结果:

ABC
ABC1
ABC11
ABC12
ABC13
ABC2
ABC20
ABC21
ABC22
ABC3
ABC31
ABC32

我需要它按数字排序:

ABC
ABC1
ABC2
ABC3
ABC11
ABC12
ABC13
ABC20
ABC21
ABC22
ABC31
ABC32

这怎么可以实现?

解决方法

您可以使用PATINDEX()函数,如下所示:
select * from Test 
order by CAST(SUBSTRING(Name + '0',PATINDEX('%[0-9]%',Name + '0'),LEN(Name + '0')) AS INT)

SQL Fiddle Demo

如果您在字符串的中间有数字,那么您需要创建小的用户定义的函数,从字符串获取数字并根据该数字排序数据,如下所示:

CREATE FUNCTION dbo.fnGetNumberFromString (@strInput VARCHAR(255)) 
RETURNS VARCHAR(255) 
AS 
BEGIN 
    DECLARE @intNumber int 
    SET @intNumber = PATINDEX('%[^0-9]%',@strInput)

    WHILE @intNumber > 0
    BEGIN 
        SET @strInput = STUFF(@strInput,@intNumber,1,'')
        SET @intNumber = PATINDEX('%[^0-9]%',@strInput)
    END 

    RETURN ISNULL(@strInput,0) 
END 
GO

您可以通过以下方式对数据进行排序:

select Name from Test order by dbo.fnGetNumberFromString(Name),Name

猜你在找的MsSQL相关文章