web-dev-qa-db-fra.com

Alternative à l'instruction IF () dans SQLite

J'ai le code pour MySQL (Perl):

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

J'ai besoin d'utiliser ce code avec SQLite, mais il n'y a pas de support de la fonction IF (). Qu'est-ce que je peux faire?

26
VeroLom

Pour le SQL générique, vous pouvez utiliser CASE:

CASE est utilisé pour fournir le type de logique if-then-else à SQL. Sa syntaxe est:

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

De http://www.sqlite.org/lang_expr.html section "L'expression CASE"

Par exemple.

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

Un autre lien sur SQLite & CASE (avec un exemple de mise à jour avec subselect) http://sqlite.awardspace.info/syntax/sqlitepg09.htm

CASE peut être utilisé dans UPDATE en SQL générique, mais je n'ai aucune information sur le support SQLite des UPDATEs avec CASE

http://www.craigsmullins.com/ssu_0899.htm section "Utilisation des expressions CASE lors de la modification des données"

59
osgx
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

N'est-ce pas mieux?

6
osgx