根据 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)
我的 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)