Case-WHEN子句的非Case条件中的SQL错误

Case-WHEN子句的非Case条件中的SQL错误,sql,sql-server,substring,Sql,Sql Server,Substring,我尝试执行以下SQL语句 SELECT CASE WHEN CHARINDEX('~','test.pdf') > 0 THEN SUBSTRING('test.pdf',CHARINDEX('~', 'test.pdf'), -10) ELSE NULL END 这导致错误“传递给子字符串函数的长度参数无效”。但是,这不是预期的,因为它无论如何都不会执行 此查询是我的需求的简化版本。实际上,我们正在计算子字符串的值长度。实

我尝试执行以下SQL语句

SELECT CASE WHEN CHARINDEX('~','test.pdf') > 0 
            THEN SUBSTRING('test.pdf',CHARINDEX('~', 'test.pdf'), -10)
            ELSE NULL
       END
这导致错误“传递给子字符串函数的长度参数无效”。但是,这不是预期的,因为它无论如何都不会执行

此查询是我的需求的简化版本。实际上,我们正在计算子字符串的值长度。实际情况如下所示:

SELECT CASE
            WHEN CHARINDEX('~', 'test.pdf') > 0 THEN SUBSTRING('test.pdf', CHARINDEX('~', 'test.pdf') + 1, CHARINDEX('~', 'test.pdf', (CHARINDEX('~', 'test.pdf', 1)) + 1) - CHARINDEX('~', 'test.pdf') - 1)
            ELSE NULL
       END;
在本例中,其硬编码为'test.pdf',但在实际场景中,它将是表列中的'111111~2222~33333~4444.pdf'之类的值。此外,我不确定此文件名是否应始终遵循此格式。因此,需要进行验证


实际上,长度的计算非常昂贵,不想在这个查询中使用它两次。

您已经将
-10
作为常量传递给
子字符串()

长度

是一个正整数或bigint表达式,指定将返回表达式的字符数。如果长度为负,则生成错误并终止语句。如果start和length之和大于表达式中的字符数,则返回从start开始的整个值表达式


SQL Server在编译阶段发现了这个问题。这与表达式求值无关,而是与解析表达式有关。

您已将
-10
作为常量传递给
子字符串()

长度

是一个正整数或bigint表达式,指定将返回表达式的字符数。如果长度为负,则生成错误并终止语句。如果start和length之和大于表达式中的字符数,则返回从start开始的整个值表达式


SQL Server在编译阶段发现了这个问题。这与
CASE
表达式计算无关,而是与解析表达式有关。

长度参数为负数,这是非常不正常的。示例数据、期望的结果以及对您希望执行的操作的解释都会有所帮助。请注意,
案例中的
ELSE NULL
表达式实际上是多余的。如果当
子句未满足时,
案例
将自动返回
NULL
@GordonLinoff按照您的建议更新问题。谢谢,请提供一个很好的样本数据和格式化文本所需的结果。长度参数为负数,这是非常不正常的。示例数据、期望的结果以及对您希望执行的操作的解释都会有所帮助。请注意,
案例中的
ELSE NULL
表达式实际上是多余的。如果当
子句未满足时,
案例
将自动返回
NULL
@GordonLinoff按照您的建议更新问题。谢谢,请提供一个好的样本数据和格式化文本的预期结果。-10只是为了说明这个问题。在第二个查询中,它是计算出来的。@SubinJacob。如果长度是一个表达式,在编译时不会检查它,也不会出现错误。然后,我做错了,用硬编码的文件名值测试了这个查询。事实上,如果它是一个表列,就不会是这样了,对吗?我们不应该在表中插入任何值,这就是为什么像这样测试-10只是为了说明问题。在第二个查询中,它是计算出来的。@SubinJacob。如果长度是一个表达式,在编译时不会检查它,也不会出现错误。然后,我做错了,用硬编码的文件名值测试了这个查询。事实上,如果它是一个表列,就不会是这样了,对吗?我们不应该在表中插入任何值,这就是为什么要这样测试