使用charindex和substring的问题

问题描述 投票:0回答:3

我有下面的代码:

declare @error varchar(max)
set @error = 'Invalid content. Error ids=[3001]'

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

我想得到数字:3001,但目前的结果是

3001]

任何人都可以解释,为什么还有括号']'?

sql sql-server tsql substring charindex
3个回答
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)

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));

1
投票

SUBSTRING的第三个参数是长度。你传递的charindex(']', @error)-1等于32.所以它将从指定的起始位置收集32个字符。

你想要做的是确定括号之间字符串的长度。为此,您需要从右括号的索引中减去左括号的索引。见下面的例子。

declare @error varchar(max)
set @error = 'Invalid content. Error ids=[3001]'

select substring(@error, charindex('[', @error)+1, (CHARINDEX(']', @error)-1) - charindex('[', @error))
© www.soinside.com 2019 - 2024. All rights reserved.