SQLite中的IF()语句替代

Ver*_*Lom 26 sql if-statement

我有MySQL(perl)的代码:

UPDATE pages
SET rkey = rkey + 2,
    lkey = IF(lkey >= $key, lkey + 2, lkey)
WHERE rkey >= $key
Run Code Online (Sandbox Code Playgroud)

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

osg*_*sgx 59

对于通用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"
Run Code Online (Sandbox Code Playgroud)

来自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
Run Code Online (Sandbox Code Playgroud)

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

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

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


osg*_*sgx 6

UPDATE pages
SET rkey = rkey + 2,
    lkey = IF(lkey >= $key, lkey + 2, lkey)
WHERE rkey >= $key
Run Code Online (Sandbox Code Playgroud)

??? 它来

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

UPDATE pages
SET rkey = rkey + 2,
WHERE rkey >= $key
Run Code Online (Sandbox Code Playgroud)

不是更好吗?


Luk*_*zda 6

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;
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考 SQLite 版本 3.32.0,添加了“IIF”,于 2020-05-22 发布 (2认同)