T-SQL 从字符串中提取十进制值

mmi*_*hia 2 sql t-sql

好的,我想要做的是从字符串中提取十进制值。我的问题是字符串不统一。有些可能是 6.9% 或 5.2mg/L,有些可能根本没有数值。我想要做的是只返回字符串中的十进制(或整数)值,如果不存在则返回 NULL。

我试过这个功能:

CREATE FUNCTION dbo.udf_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
Run Code Online (Sandbox Code Playgroud)

但这只会返回没有小数位的数字。

Ale*_*lex 5

您只需要.在两个PATINDEX表达式中添加一个(点):

CREATE FUNCTION dbo.Udf_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
Run Code Online (Sandbox Code Playgroud)


Gor*_*off 5

另一种方法是删除字符串之后和字符串之前的字符。以下表达式执行此操作:

select val, 
       stuff(stuff(val+'x', patindex('%[0-9][^0-9.]%', val+'x') + 1, len(val), ''
                  ), 1, patindex('%[0-9]%', val) - 1, '')
from (values ('test123 xxx'), ('123.4'), ('123.4yyyyy'), ('tasdf 8.9'), ('asdb'), ('.2345')) as t(val);
Run Code Online (Sandbox Code Playgroud)

内部stuff()删除数字后的字符。的+'x' 处理时的数量为在字符串的末尾时出现的问题。第一部分处理编号之前的部分。

这确实假设字符串中只有一个数字。您可以使用 where 子句进行检查,例如:

where val not like '%[0-9]%[^0-9.]%[0-9]%'
Run Code Online (Sandbox Code Playgroud)