我有MySQL的Perl代码:
UPDATE pages
SET rkey = rkey + 2,
lkey = IF(lkey >= $key, lkey + 2, lkey)
WHERE rkey >= $key
我需要在SQLite中使用这段代码,但是IF()函数没有被支持。我该怎么做?
我有MySQL的Perl代码:
UPDATE pages
SET rkey = rkey + 2,
lkey = IF(lkey >= $key, lkey + 2, lkey)
WHERE rkey >= $key
我需要在SQLite中使用这段代码,但是IF()函数没有被支持。我该怎么做?
对于通用的SQL,可以使用CASE
:
CASE
用于为SQL提供if-then-else类型的逻辑。其语法如下:从http://www.sqlite.org/lang_expr.html 的“The CASE expression”部分获取。
SELECT CASE ("column_name") WHEN "condition1" THEN "result1" WHEN "condition2" THEN "result2" ... [ELSE "resultN"] END FROM "table_name"
例如。
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
在通用SQL中,可以在UPDATE语句中使用CASE,但是我不确定SQLite是否支持带有CASE的UPDATE。
http://www.craigsmullins.com/ssu_0899.htm 的"使用CASE表达式修改数据"章节。
SQLite 3.32.0及更高版本支持IIF函数。
iif(X,Y,Z)函数在X为真时返回Y,在X为假时返回Z。
iif(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;
IIF
函数。 - Mathieu ReyUPDATE pages
SET rkey = rkey + 2,
lkey = IF(lkey >= $key, lkey + 2, lkey)
WHERE rkey >= $key
??? it to
UPDATE pages
SET lkey = lkey + 2
WHERE rkey >= $key AND lkey >= $key
UPDATE pages
SET rkey = rkey + 2,
WHERE rkey >= $key
这不是更好吗?