我的表中有一个名为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
所以我被困在这里。我希望有人可以帮我找到这个
答案 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)