SQLite 中的 IF() 语句替代方案

问题描述 投票:0回答:4

我有 MySQL (perl) 的代码:

UPDATE pages
SET rkey = rkey + 2,
    lkey = IF(lkey >= $key, lkey + 2, lkey)
WHERE rkey >= $key

我需要在 SQLite 中使用此代码,但不支持 IF() 函数。我能做什么?

sql sqlite if-statement
4个回答
71
投票

对于通用 SQL,您可以使用

CASE
:

CASE 用于向 SQL 提供 if-then-else 类型的逻辑。它的语法是:

SELECT CASE ("column_name")
  WHEN "condition1" THEN "result1"
  WHEN "condition2" THEN "result2"
  ...
  [ELSE "resultN"]
  END
FROM "table_name"

来自 http://www.sqlite.org/lang_expr.html“CASE 表达式”部分

例如

UPDATE pages
SET rkey = rkey + 2,
    lkey = CASE  WHEN lkey >= $key THEN lkey + 2 ELSE lkey END
WHERE rkey >= $key

关于 SQLite 和 CASE 的另一个链接(带有子选择更新的示例)http://sqlite.awardspace.info/syntax/sqlitepg09.htm

CASE 可以在通用 SQL 的 UPDATE 中使用,但我没有关于 SQLite 支持使用 CASE 进行 UPDATE 的信息

http://www.craigsmullins.com/ssu_0899.htm“修改数据时使用 CASE 表达式”部分


11
投票

SQLite 版本 3.32.0 及更高版本支持

IIF

iif(X,Y,Z)

如果 X 为真,iif(X,Y,Z) 函数返回值 Y,否则返回 Z。

iff(X,Y,Z) 函数在逻辑上等价于 CASE 表达式“CASE WHEN X THEN Y ELSE Z END”,并生成相同的字节码。


例如

UPDATE pages
SET rkey = rkey + 2,
    lkey = IIF(lkey >= $key, lkey + 2, lkey)
WHERE rkey >= $key;

7
投票
UPDATE pages
SET rkey = rkey + 2,
    lkey = IF(lkey >= $key, lkey + 2, lkey)
WHERE rkey >= $key

???它到

UPDATE pages
SET lkey = lkey + 2
WHERE rkey >= $key AND lkey >= $key

UPDATE pages
SET rkey = rkey + 2,
WHERE rkey >= $key

这样不是更好吗?


0
投票
UPDATE pages
SET rkey = rkey + 2,
lkey = IIF(lkey >= $key, lkey + 2, lkey)
WHERE rkey >= $key
© www.soinside.com 2019 - 2024. All rights reserved.