【问题标题】:IF() statement alternative in SQLiteSQLite 中的 IF() 语句替代
【发布时间】:2020-10-12 16:25:57
【问题描述】:

我有 MySQL (perl) 的代码:

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

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

【问题讨论】:

    标签: sql sqlite if-statement


    【解决方案1】:

    对于通用 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 进行更新的信息

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

    【讨论】:

    • 谢谢,但我在 UPDATE 子句中需要它
    • VeroLom,只需在 UPDATE 中尝试。 CASE 是基本表达式扫描的一部分,而不是 SELECT 的一部分。
    • 当我使用代码 "...lkey = CASE WHEN lkey => $key THEN lkey + 2 ELSE lkey END...
    • 已更新。如果代码不起作用,您可以尝试使用 subselects with case
    • 嗯...我在 sqlitebrowser 中尝试过,它可以正常工作,但是当我在 Perl 中尝试时,我等待了很长时间。
    【解决方案2】:

    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;
    

    【讨论】:

    • FYI SQLite 版本 3.32.0,增加了IIF,于 2020-05-22 发布
    【解决方案3】:
    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
    

    不是更好吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-05
      • 2010-12-09
      • 2016-09-18
      • 2016-08-30
      • 1970-01-01
      • 1970-01-01
      • 2018-03-29
      相关资源
      最近更新 更多