【发布时间】:2018-04-18 10:33:59
【问题描述】:
我有一个数据库,其中大多数 testid 的括号中都有我想要提取的信息。所以我写了(简化版)
select
case when wt.testid like '%(%)%'
then substring(wt.testid,
charindex('(',wt.testid)+1,
(charindex(')',wt.testid) - charindex('(',wt.testid) - 1)
)
工作得很好,但并非所有这些测试都具有这种格式,有些在下划线之后和空格之前具有此信息,
所以我添加了这个额外的部分
else substring(wt.testid,
charindex('_',wt.testid)+1,
(charindex(' ',wt.testid) - charindex('_',wt.testid) -1)
)
但由于某种原因,这会导致“传递给 SUBSTRING 函数的长度参数无效。”
如果我删除 -1 则查询有效,这表明 -1 导致长度参数为负数,但查询的所有结果都有空格和下划线,并且当我通过时
p>(charindex(' ',wt.testid) - charindex('_',wt.testid) -1)
在我的选择中,我总是得到正值,所以我不知道发生了什么。
【问题讨论】:
-
testid中是否还有不 包含空格和下划线但通过ON或WHERE子句谓词过滤掉的值?跨度> -
您可以通过在原始查询中显式过滤
WHERE (charindex(' ',wt.testid) - charindex('_',wt.testid) -1) < 0轻松找到违规值,然后更仔细地查看。对“我总是得到积极的价值观”的简单回应是“那么SUBSTRING永远不会失败”,但确实如此,所以你的假设一定有缺陷。 -
抱歉,没有看到这些 cmets,但 Damien_The_Unbeliever 的其他答案已经确定了! :)
标签: sql-server database