在sql server中的字符串中基于起始编号(Number可能是十进制)的列顺序排序

时间:2015-09-22 14:12:24

标签: sql-server sql-server-2008-r2 sql-order-by

我的表中有一个名为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

我已经使用了上面的函数,但它将返回字符串中的所有数字 例 如果字符串是12.dddh5555 然后它返回125555

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

1 个答案:

答案 0 :(得分:2)

试试这段代码:

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))

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

有功能:

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)