CASE表达式没有短路评估?

时间:2013-02-07 23:16:34

标签: sql sqlite case short-circuiting

我最近开始自学(可怕)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 个答案:

答案 0 :(得分:1)

如果您确实只为每个满足条件的counting_column添加1,则可以使用 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" = ...

中使用双引号