SELECT
CASE
WHEN CHARINDEX('$','$2,500') > 0
THEN
CASE
WHEN CHARINDEX(' ','$2,500', CHARINDEX('$','$2,500') + 2) > 0
THEN SUBSTRING('$2,500', CHARINDEX('$', '$2,500'), CHARINDEX(' ', '$2,500', CHARINDEX('$', '$2,500') + 2) - CHARINDEX('$', '$2,500'))
ELSE SUBSTRING('$2,500', CHARINDEX('$', '$2,500'), LEN('$2,500') - CHARINDEX('$', '$2,500') + 1)
END
ELSE '$2,500'
END
我有一个类型为
varchar
的变量,它可能在数字后面包含一些随机单词,所以我要做的是如果变量在数字后面包含空格(空格也可能在$后面,所以我们不必考虑这一点)然后从 $ 符号开始直到数字后面的空格处取子字符串。
但是在上面的情况下,没有空格,所以它应该进入 if 部分,这基本上是正常的,但它给出了无效的长度参数传递错误。
SELECT
CASE
WHEN CHARINDEX('$', '$2,500') > 0
THEN
CASE
WHEN CHARINDEX(' ', '$2,500', CHARINDEX('$', '$2,500') + 2) > 0
THEN SUBSTRING('$2,500', CHARINDEX('$', '$2,500'), CHARINDEX(' ', '$2,500', CHARINDEX('$', '$2,500') + 2) - CHARINDEX('$', '$2,500'))
ELSE SUBSTRING('$2,500', CHARINDEX('$', '$2,500'), LEN('$2,500') - CHARINDEX('$', '$2,500') + 1)
END
ELSE '$2,500'
END
您向 substring 函数传递了一个错误的参数,即使该函数最终没有出现在您的执行路径中。它仍然必须正确输入等等。
从文档(上面的链接)来看,“length”参数“是一个正整数或bigint表达式,指定将返回表达式的多少个字符。如果length为负数,则会生成错误并终止语句。 “
您可以在这里查看问题:
SELECT CASE WHEN 1=0 THEN SUBSTRING('$2,500',1,-5) ELSE 'Success' END
它抛出同样的错误。
传递给子字符串函数的长度参数无效。
因为您无法将负值传递给
length
函数的 substring()
参数,所以您需要在 sql 中使用如下所示的内容来解释这一点:
THEN SUBSTRING('$2,500', CHARINDEX('$', '$2,500'), GREATEST(CHARINDEX(' ', '$2,500', CHARINDEX('$', '$2,500') + 2) - CHARINDEX('$', '$2,500'), 0))
在这里工作dbfiddle