Select 两个值之间的字符串部分 SQL 2008

Select part of a string between two values SQL 2008

我正在尝试 select 两个值之间的 strint 的一部分,我设法让它工作到大约 90%,但随后出现错误 -

SUBSTRING(TranText, CHARINDEX('x', TranText) + 1, LEN(TranText) - CHARINDEX('x', TranText) - CHARINDEX('/', REVERSE(TranText)))

查询的字段是这样的

Start Date : 01/02/2013 50 x 156.00/MX + 207.64

期望的结果是

156.00

现在我认为问题是因为有时 X 可以在其前后有一个 space,或者根本没有 space。它在抛出之前通过了大约 114,000 行

Invalid length parameter passed to the LEFT or SUBSTRING function.

但正在努力解决。

试试这个。使用REPLACE函数然后解析。

DECLARE @string AS VARCHAR(100),  @result AS VARCHAR(100)
DECLARE @nStart AS int

SET @string = 'Start Date : 01/02/2013 50 x 156.00/MX + 207.64'
SET @result = REPLACE(@string, '/', '')
SET @nStart = CHARINDEX('x', @result) + 1
SET @result = SUBSTRING(@result, @nStart, CHARINDEX('M',@result) - @nStart)

SELECT @result

主要原因可能是因为 LEN(@QRY) - CHARINDEX('x', @QRY)-CHARINDEX('/', REVERSE(@QRY)) 小于零,即负值。这反过来会在 SUBSTRING 中抛出错误,因为 SUBSTRING 的最小索引为零。因此,我们在 case 语句中检查该条件。

SELECT CASE WHEN LEN(TranText) - CHARINDEX('x',TranText)-CHARINDEX('/', REVERSE(TranText)) >= 0 THEN
SUBSTRING(TranText, CHARINDEX('x', TranText) + 1, LEN(TranText) - CHARINDEX('x', TranText) - CHARINDEX('/', REVERSE(TranText)))
ELSE NULL END
FROM YOURTABLE