我有MySQL(perl)的代码:
UPDATE pages
SET rkey = rkey + 2,
lkey = IF(lkey >= $key, lkey + 2, lkey)
WHERE rkey >= $key
我需要在SQLite中使用此代码,但不支持IF()函数。我能做什么?
答案 0 :(得分:58)
对于通用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表达式”
E.g。
UPDATE pages
SET rkey = rkey + 2,
lkey = CASE WHEN lkey >= $key THEN lkey + 2 ELSE lkey END
WHERE rkey >= $key
关于SQLite& amp;的另一个链接CASE(带有subselect的更新示例)http://sqlite.awardspace.info/syntax/sqlitepg09.htm
CASE可以在通用SQL的UPDATE中使用,但我没有关于SQLite对带有CASE的UPDATE的支持的信息
http://www.craigsmullins.com/ssu_0899.htm部分“修改数据时使用CASE表达式”
答案 1 :(得分:6)
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
不是更好吗?
答案 2 :(得分:5)
SQLite版本3.32.0和更高版本支持IIF
。
如果X为true,则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;