Case WHEN子句的非大小写条件中存在SQL错误



我尝试执行以下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~22222~33333~44444.pdf"。此外,我不确定这个文件名是否应该始终遵循这种格式。因此,需要进行验证。

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

您已将-10作为常量传递给substring()。此函数不允许第三个参数为负值:

长度

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

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

最新更新