我的代码如下:
declare @error varchar(max)
set @error = 'Invalid content. Error ids=[3001]'
select substring(@error, charindex('[', @error)+1, charindex(']', @error)-1)
我想得到号码:3001,但目前的结果是
3001]
任何人都可以解释,为什么还有支架']' ?
答案 0 :(得分:3)
因为substring
的第三个参数表示length of substring
,而不是从索引到索引
参考:https://docs.microsoft.com/en-us/sql/t-sql/functions/substring-transact-sql
你可以试试这个
select substring(@error, charindex('[', @error)+1, charindex(']', @error) - charindex('[', @error) - 1)
答案 1 :(得分:2)
通过将查询拆分为多个部分,可以更轻松地解释这一点。
首先:
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));
答案 2 :(得分:1)
SUBSTRING的第三个参数是长度。您正在传递等于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))