提问人:amatof 提问时间:9/1/2023 最后编辑:amatof 更新时间:9/1/2023 访问量:74
从自由文本字段中提取数字并将“k”替换为“000”的功能
Function to pull numbers from free text field and replace 'k' with '000'
问:
我的数据中有一个自由文本列,其中包含单词和数字。我正在使用 Microsoft SQL Server。
例如:“Johnny 收到了 1,000 件产品。
我只想从此列中提取数字,我已经成功地使用以下功能完成了这些操作:
CREATE FUNCTION getNumericValue (@inputString varchar(500))
RETURNS varchar(500)
AS
BEGIN
DECLARE @integerPart INT
SET @integerPart = PATINDEX('%[^0-9]%', @inputString)
BEGIN
WHILE @integerPart > 0
BEGIN
SET @inputString = STUFF(@inputString, @integerPart, 1, '')
SET @integerPart = PATINDEX('%[^0-9]%', @inputString)
END
END
RETURN ISNULL(@inputString, 0)
END
GO
但是有一些使用单位的观察结果,例如:“Johnny 收到了 1k 产品。有没有办法修改这个函数,当有一个数字附加了“k”时,它会用“000”替换k,或者如果有一个附加了“m”的数字,它会用“000000”替换m?
还有一些观察结果包括句子末尾的日期,这些日期应该被排除在外 - 只应包括找到的第一个数字。
答:
2赞
Stu
9/1/2023
#1
您可以尝试以下函数,该函数利用内置的翻译函数去除非数字字符,然后使用一些 patindex 检查和一些大小写表达式逻辑来应用您的“k”或“m”乘法器:
create or alter function dbo.getNumericValue (@inputString Varchar(500))
returns Varchar(20)
as
begin
return (
select Try_Convert(Int, Replace(Translate(s,'ABCDEFGHIJKLMNOPQRSTUVWXYZ.,',Replicate('*',28)), '*','')
* Choose(case c when 'k' then 2 when 'm' then 3 else 1 end, 1, 1000, 1000000))
from (select @inputString s)s
cross apply(values( NullIf(PatIndex('%[0-9][mk] %', s), 0)))p(p)
cross apply(values(Substring(s, p + 1, 1)))c(c)
);
end;
根据源数据,您可以向列表中添加任何其他必需的标点符号。
如果针对一大组行运行,我将使用表值函数而不是标量。
评论