加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2020-12-12 08:38:24 所属栏目:MsSql教程 来源:网络整理
导读:我的表中有以下值: ABCABC1ABC2ABC3 and so on...ABC11ABC12ABC13 and so on..ABC20ABC21ABC22 and so on.. 所以基本上我有的是任何字符串值(不总是ABC,任何字符串值),可以跟随数字,或者它可能只是一个没有数字的字符串. 当我从列表中选择*从我的列asc我得到
我的表中有以下值:
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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读