Альтернативный оператор IF () в SQLite - PullRequest
26 голосов
/ 02 февраля 2011

У меня есть код для MySQL (perl):

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

Мне нужно использовать этот код с SQLite, но функция IF () не поддерживается.Что я могу сделать?

Ответы [ 2 ]

58 голосов
/ 02 февраля 2011

Для универсального SQL вы можете использовать CASE:

CASE используется для предоставления логики типа if-then-else для SQL.Его синтаксис:

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 можно использовать в UPDATE в универсальном SQL, но у меня нет информации о поддержке SQLite UPDATE с CASE

http://www.craigsmullins.com/ssu_0899.htm раздел «Использование выражений CASE при изменении данных»

6 голосов
/ 02 февраля 2011
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

Разве это не лучше?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...