提取已知字符串和最后一个字符之间的字符串

问题描述 投票:1回答:1

我正在尝试从已知字符串和最后一个字符之间提取字符串。我需要提取两个不同的美元值,而不带美元符号。我可以得到第一个,但第二个却一直失败。问题是最后一个字符(句点/小数)在数据中存在多次。我的查询将正确返回第一个金额109.99,但返回空白而不是第二个金额89.99。此外,美元金额的字符长度可能会有所不同,因此我无法使用固定长度来提取所需的结果。

DECLARE @string VARCHAR(MAX);

SET @string = 'amount changed from $109.99 to $89.99.';

SELECT

CASE

WHEN CHARINDEX(' to ', @string) - (CHARINDEX('amount changed from $', @string) + LEN('amount changed from $')) < 0 THEN ''

ELSE SUBSTRING(@string, CHARINDEX('amount changed from $', @string) + LEN('amount changed from $'), CHARINDEX(' to ', @string) - (CHARINDEX('amount changed from $', @string) + LEN('amount changed from $')))

END AS Amount_A,

CASE

WHEN CHARINDEX('.', @string) - (CHARINDEX(' to $', @string) + LEN(' to $')) < 0 THEN ''

ELSE SUBSTRING(@string, CHARINDEX(' to $', @string) + LEN(' to $'), CHARINDEX('.', @string) - (CHARINDEX(' to $', @string) + LEN(' to $')))

END AS Amount_B;
sql substring
1个回答
0
投票

这可能并不优雅,但是可以。请参阅注释以获取解释。 reverse()在这里有很大帮助。FTR,这里您只需要两个SELECT,其余只是为了澄清。

DECLARE @string VARCHAR(MAX);
SET @string = 'amount changed from $109.99 to $89.99.';
-- position of first $:
print charindex('$',@string)
-- position of first space after first $:
print charindex(' ', @string,charindex('$',@string))
-- the length between first $ and first space after first $:
print charindex(' ', @string, charindex('$',@string))-charindex('$',@string)-1
-- combine to select the first value:
select substring(@string,charindex('$',@string)+1, charindex(' ', @string, charindex('$',@string))-charindex('$',@string)-1)

-- the second $ sign (first $ after first $), plus 1 cause we don't want the $ itself:
print charindex('$',@string,charindex('$',@string)+1)+1
-- first $ from behind gives us the length of the string from second $ to the end:
print charindex('$',reverse(@string),0)-1
-- we don't want the last dot:
print charindex('$',reverse(@string),0)-2
-- combine to select the first value:
select substring(@string, charindex('$',@string,charindex('$',@string)+1)+1, charindex('$',reverse(@string),0)-2)
© www.soinside.com 2019 - 2024. All rights reserved.