【问题标题】:CASE expression that does NOT have short-circuit evaluation?没有短路评估的 CASE 表达式?
【发布时间】: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 的条目。任何帮助将不胜感激。

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

【问题讨论】:

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

标签: sql sqlite case short-circuiting


【解决方案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" = ...

【讨论】:

  • 非常感谢,这确实是我所做的一切,而且效果很好。就像我说的,我不太擅长这个,所以我做不到。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-25
  • 2016-01-10
  • 2011-08-07
相关资源
最近更新 更多