sql - 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() 函数无济于事。当我复制数据时,无论如何似乎没有任何多余的空格,所以我不知道问题是什么。
解决方案
让我们取 value 'Some [value] here'
,我假设你想要 value 'value'
。
首先,CHARINDEX('[', [Attribute 11], 0) + 1
将返回第一个字符7
的位置+1 。[
接下来你有CHARINDEX(']', [Attribute 11], 0) - 1
which 返回 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
,从而获得所需的字符长度。
推荐阅读
- azure - 使用 Azure 数据工厂 v2 的 ETL
- firebase - 基于集合的firestore查询过滤器
- google-sheets - 如何使用自定义标准对谷歌工作表中的项目进行排序
- iis - 配置 IIS 以启用目录浏览,无需 Kestrel 劫持路由
- testing - chai-http 将两个不同的同名字段视为一个字段
- webpack - 如何使 SASS 可用于 NextJS 中的自定义 Webpack 实现?
- ios - 如何使 Dropbox 的下载任务无效
- ios - 在 CCAvenue iOS 中解密应用程序请求的问题
- unity3d - 在加载场景之前调用 Update()
- python - 在不使用 dask 数据框的情况下获取 dask 数组的唯一行