SQL如何按字母顺序对数字进行数字排序,然后按数字排序

时间:2019-10-11 13:39:22

标签: sql sql-server numeric

我有一个包含字母数字值的表。我想先按字母顺序,然后按数字顺序。我正在编辑问题以寻求更多帮助...我只需要将字符串末尾的数字进行数字排序即可。

我想要这个例子

ControlName (column)
--------------------
VALVE 1
MAIN VALVE
VALVE 10
BOILER 2
VALVE 17
BOILER 1
VALVE 19
VALVE 2

要以此排序

ControlName (column)
----------------
BOILER 1
BOILER 2
MAIN VALVE
VALVE 1
VALVE 2
VALVE 10
VALVE 17
VALVE 19

什么(轻型)查询可以完成此任务?

3 个答案:

答案 0 :(得分:4)

现在问题就解决了,如果字符串中包含多于一组的数字部分,我们要按最后一组数字进行排序。此代码将做到这一点。如果只有一组数字甚至没有数字,则可以使用。

declare @Something table
(
    ControlName varchar(50)
)

insert @Something values
('VALVE 1')
, ('MAIN VALVE')
, ('VALVE 10')
, ('BOILER 2')
, ('VALVE 17')
, ('BOILER 1')
, ('VALVE 19')
, ('VALVE 2')

select *
from @Something
order by left(ControlName, LEN(ControlName) - patindex('%[^0-9]%', REVERSE(ControlName)) + 1) --this gets the "prefix" or characters before the last set of numbers
    , convert(int, right(ControlName, patindex('%[^0-9]%', REVERSE(ControlName)) - 1)) --this gets the last set of numbers

答案 1 :(得分:2)

这是一个在文本末尾的数字前加两个零的函数。例如,锅炉1将变为锅炉001,锅炉12将变为锅炉012。

CREATE FUNCTION [dbo].[sortTextWithNum](@text nvarchar(max))
returns nvarchar(max) as 
begin
    declare @reverse nvarchar(max) = reverse(@text)
    declare @numIndex int = patindex('%[^0-9]%', @reverse)
    return iif(@numIndex=1, @text, substring(@text, 0, len(@text)-@numIndex+2) + format(cast(reverse(left(@reverse, @numIndex-1)) as int),'D3'))
end

您可以像这样使用它:

select ControlName from [YourTable] order by dbo.sortTextWithNum(ControlName)

答案 2 :(得分:0)

我认为更简单的顺序说明是:

select *
from @something s
order by left(ControlName, patindex('%[0-9]%', ControlName + '0') - 1),
         len(ControlName),
         ControlName

按键顺序执行以下操作:

  • 按第一个数字之前的所有内容排序。
  • 按控件名称的长度排序,因此较短的数字(1)在较大的数字(100)之前。
  • 按名称排序,因此数字是按顺序排列的。
相关问题