没有短路评估的 CASE 表达式?

Posted

技术标签:

【中文标题】没有短路评估的 CASE 表达式?【英文标题】:CASE expression that does NOT have short-circuit evaluation? 【发布时间】:2013-01-23 15:36:37 【问题描述】:

我最近开始自学(糟糕)SQLite。令我感到恼火的一件事是 CASE 表达式,即它采用短路评估这一事实。

有没有办法解决这个问题?我正在寻找不使用短路评估的 CASE 语句。

UPDATE [table]SET [counting_column] =

(
CASE
    when [column1] = NULL 
    then [counting_column] + 1

    ...

    when [column31] = NULL
    then [counting_column] + 1
end
)

我希望数据库中的每个条目都由每个 case 语句进行测试,而不仅仅是第一个评估为 true 的条目。任何帮助将不胜感激。

注意:如果有一些明显的错误,我深表歉意——我对此很陌生,所以请放轻松。

【问题讨论】:

您能举一个需要非短路评估的例子吗? 取决于你想要做什么——如果需要,你可以在彼此内部有多个案例...示例数据,期望的结果——也许我们可以提供帮助。 感谢您的回复。我将我的问题编辑得更具体,抱歉含糊不清。 【参考方案1】:

如果您确实只是为满足的每个条件将 1 添加到 counting_column,则可以使用 n CASE 语句链并将结果加在一起。每个单独的CASE 提供一个01,所有这些都加在一起并添加到counting_column 的当前值。

UPDATE [table] SET [counting_column] =
(
  [counting_column] + 
  (CASE when [column1] IS NULL then 1 ELSE 0 END) +
  (CASE when [column2] IS NULL then 1 ELSE 0 END) +
    ...
    ...
  (CASE when [column30] IS NULL then 1 ELSE 0 END) +
  (CASE when [column31] IS NULL then 1 ELSE 0 END)
)

请注意,我已将 = NULL 更改为 IS NULLNULL 是一个特殊的非值,不能与相等 = 进行比较。

我还要指出,虽然[] 封闭标识符在 SQLite 中是可以的,但这主要是为了与 T-SQL 兼容。更标准的方法是使用双引号,如UPDATE "table" SET "counting_column" = ...

【讨论】:

非常感谢,这确实是我所做的一切,而且效果很好。就像我说的,我不太擅长这个,所以我做不到。

以上是关于没有短路评估的 CASE 表达式?的主要内容,如果未能解决你的问题,请参考以下文章

是否存在程序员可能希望避免对布尔表达式进行短路评估的合理场景? [关闭]

JOIN 子句中的 MySQL 逻辑评估是不是延迟/短路?

关于短路评估的安全问题[重复]

c中的内部短路评估

具有 SUM 聚合的 Postgres CASE 条件评估不需要的 ELSE 部分

短路评估顺序和前缀增量运算符