【发布时间】:2020-08-20 11:42:05
【问题描述】:
我尝试执行以下 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~4444.pdf”之类的值。另外,我不确定这个文件名是否应该始终遵循这种格式。因此,需要进行验证。
其实长度的计算是相当昂贵的,不想在这个查询中使用两次。
【问题讨论】:
-
长度参数为负数,比较不正统。样本数据、所需结果以及对您想要做什么的解释会有所帮助。
-
旁注,
CASE表达式 中的ELSE NULL实际上是多余的。如果没有满足任何WHEN子句,则CASE将自动返回NULL。 -
@GordonLinoff 按照您的建议更新了问题。谢谢
-
请以格式化文本的形式提供良好的示例数据和所需的结果。
标签: sql sql-server substring