使用Charindex和substring的问题



我有以下代码:

declare @error varchar(max)
set @error = 'Invalid content. Error ids=[3001]'
select substring(@error, charindex('[', @error)+1, charindex(']', @error)-1)

我想获得数字:3001,但是当前结果是

3001]

有人可以解释,为什么仍然有括号']?

,因为substring的第三个参数表示length of substring,而不是索引到索引

参考:https://learn.microsoft.com/en-us/sql/t-sql/functions/substring-transact-sql

您可以尝试此

select substring(@error, charindex('[', @error)+1, charindex(']', @error) - charindex('[', @error) - 1)

通过将查询分成部分来更容易解释。

首先:

SELECT charindex('[', @error)+1;

这返回29.似乎是正确的。下一个:

SELECT charindex(']', @error) -1;

这返回32.这意味着您因此要做:

SELECT SUBSTRING(@error, 29, 32);

看看您现在出错了哪里?第三参数是您想要多少个字符。您不需要32,您想要4。因此,尝试:

SELECT SUBSTRING(@error, CHARINDEX('[', @error)+1, CHARINDEX(']', @error) - (CHARINDEX('[', @error)+1));

基因的第三个参数是长度。您正在通过等于32的charindex(']', @error)-1。因此,它将从指示的起始位置收集32个字符。

您试图做的是确定括号之间的字符串长度。为此,您需要从右括号的索引中减去左支架的索引。请参阅下面的示例。

declare @error varchar(max)
set @error = 'Invalid content. Error ids=[3001]'
select substring(@error, charindex('[', @error)+1, (CHARINDEX(']', @error)-1) - charindex('[', @error))

最新更新