首页 > 解决方案 > Charindex 不会选择正确的字符

问题描述

我正在尝试使用 Substring() 和 Charindex() 的组合选择一个包含在两个方括号内的值,但是我的第二个 Charindex() 实例不会像宣传的那样工作。

select substring([Attribute 11], CHARINDEX('[', [Attribute 11], 0) + 1, CHARINDEX(']', [Attribute 11], 0) - 1))
from Table1
where [Attribute 11] like '%]%'

起始位置的 Charindex() 工作正常,并删除了第一个括号,之后添加了 +1。但是,结束位置 - 1 在我将其更改为 - 19 (另一列为 - 10)之前不起作用。我试过 Rtrim() 和 Ltrim() 函数无济于事。当我复制数据时,无论如何似乎没有任何多余的空格,所以我不知道问题是什么。

标签: sqlsql-server

解决方案


让我们取 value 'Some [value] here',我假设你想要 value 'value'

首先,CHARINDEX('[', [Attribute 11], 0) + 1将返回第一个字符7的位置+1 。[

接下来你有CHARINDEX(']', [Attribute 11], 0) - 1which 返回 11。这也是正确的,因为角色]位于 12 位,并且12-1=11

太好了,CHARINDEX表达没有问题。

似乎认为 for 的第三个参数SUBSTRING是结束位置;它不是。快速访问SUBSTRING (Transact-SQL)会告诉你它是长度而不是结束。

因此,你有SUBSTRING你想要下一个11字符的地方,从 position 开始7。那返回'value] here'。因此,您所写的内容与所写的完全一样。CHARINDEX这里的或没有错SUBSTRING

相反,您可能想要的是:

SELECT SUBSTRING([Attribute 11], CHARINDEX('[', [Attribute 11], 0) + 1, CHARINDEX(']', [Attribute 11], 0) - CHARINDEX('[', [Attribute 11], 0) -1),
FROM dbo.Table1
WHERE [Attribute 11] like '%]%';

哪个,对于我的示例值,将返回'value'. 这会从第二个中减去第一个的值CHARINDEX,从而获得所需的字符长度。


推荐阅读