我的表中有以下值:
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)
如果您在字符串的中间有数字,那么您需要创建小的用户定义的函数,从字符串获取数字并根据该数字排序数据,如下所示:
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