【问题标题】:SQL Error in Non Case condition of CASE WHEN clauseCASE WHEN 子句的非 case 条件中的 SQL 错误
【发布时间】: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


【解决方案1】:

您已将-10 作为常量传递给substring()This function does not allow negative values for the third argument:

长度

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

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

【讨论】:

  • -10 只是为了说明问题。在第二个查询中计算它。
  • @SubinJacob 。 . .如果长度是表达式,则在编译时不会检查它,您不会收到错误。
  • 然后,我做错了,用硬编码的文件名值测试这个查询。实际上,如果它是一个表格列,就不会是这种情况,对吧?我们不应该向表中插入任何值,这就是为什么要这样测试
猜你喜欢
  • 1970-01-01
  • 2012-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-14
  • 2021-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多