根据 sql 服务器中字符串中的起始数字(数字可以是十进制)按列排序

order by column based on starting Number(Number may be decimal) in a string in sql server

我的 table 中有一个名为 name 的列,下面包含示例数据

name 
-----
1.arun888
2.nikl55555
11.abcd5566
1.123.bhdf
2.767ss777
1.21cdm

我想像下面这样对 deatils 进行排序

name
----
1.arun888
1.123.bhdf
1.21cdm
2.nikl55555
2.767ss777
11.abcd5566

我尝试了很多方法,但都不适合我

我用过的第一种方法

DECLARE @string varchar(100),
 @start int,
 @end int,
 @len int

SET @string = '66555.12tttthe hollies 12345 Test Ad77dress Dr.'
set @string = replace(@string, ' ' , '')
set @len = len(@string)

set @start =  PATINDEX('%[0-9]%',@string)

set @end =  PATINDEX('%[^0-9]%',substring(@string, @start, @len))-1
print substring(@string, @start, @end)

但它只给出 66555 但是我需要 66555.12

我用过的第二种方法

CREATE FUNCTION dbo.fn_GetNumeric
(@strAlphaNumeric VARCHAR(256))
RETURNS VARCHAR(256)
AS
BEGIN
DECLARE @intAlpha INT
SET @intAlpha = PATINDEX('%[^0-9]%', @strAlphaNumeric)
BEGIN
WHILE @intAlpha > 0
BEGIN
SET @strAlphaNumeric = STUFF(@strAlphaNumeric, @intAlpha, 1, '' )
SET @intAlpha = PATINDEX('%[^0-9]%', @strAlphaNumeric )
END
END
RETURN ISNULL(@strAlphaNumeric,0)
END
GO

我已经使用了上面的函数,但是它会 return 来自字符串的所有数字 例子 如果字符串是 12.dddh5555 然后 return 125555

所以我被困在这里了。我希望有人能帮我找到这个

试试这个代码:

DECLARE @t TABLE ( name VARCHAR(20) )

INSERT  INTO @t
VALUES  ( '1.arun888' ),
        ( '2.nikl55555' ),
        ( '11.abcd5566' ),
        ( '1.123.bhdf' ),
        ( '2.767ss777' ),
        ( '1.21cdm' );
WITH    cte
          AS ( SELECT   name ,
                        SUBSTRING(name, 1, PATINDEX('%[^0-9.]%', name) - 1) d
               FROM     @t
             )
    SELECT  *
    FROM    cte
    ORDER BY CAST(CASE WHEN RIGHT(d, 1) = '.' THEN SUBSTRING(d, 1, LEN(d) - 1)
                       WHEN d = '' THEN '0'
                       ELSE d
                  END AS DECIMAL(30, 10))

首先我 select 子串直到第一个不是点或数字的符号。然后只需删除最后一个点并按结果排序。

具有函数:

CREATE FUNCTION dbo.fn_GetNumeric
    (
      @strAlphaNumeric VARCHAR(256)
    )
RETURNS DECIMAL(30, 10)
AS
    BEGIN
        DECLARE @s1 VARCHAR(256) = SUBSTRING(@strAlphaNumeric, 1,
                                             PATINDEX('%[^0-9.]%',
                                                      @strAlphaNumeric) - 1)


        RETURN CAST(CASE WHEN RIGHT(@s1, 1) = '.' THEN SUBSTRING(@s1, 1, LEN(@s1) - 1)
                         WHEN @s1 = '' THEN '0'
                         ELSE @s1
                    END AS DECIMAL(30, 10))
    END
GO

SELECT  * FROM TableName 
ORDER BY dbo.fn_GetNumeric(name)