Sentencia CASE en consulta SQLite


¿Por qué esta consulta no funciona? : (Traté de reemplazar anidado SI declaración"...SET lkey= IF(lkey > = 11, lkey-5, IF (lkey > 5, lkey + 2, lkey)) "

UPDATE pages
SET lkey = CASE lkey WHEN lkey >= 11 THEN
        lkey - 5
    ELSE
        CASE lkey WHEN lkey > 5 THEN
            lkey + 2
        ELSE
            lkey
        END
    END,
    rkey = CASE lkey WHEN lkey >= 11 THEN
        rkey - 5
    ELSE
        CASE rkey WHEN rkey < 11 THEN
            rkey + 2
        ELSE
            rkey
        END
    END
WHERE rkey > 5 AND
    lkey < 12;
Author: VeroLom, 2011-02-11

2 answers

La sintaxis es incorrecta en esta cláusula (y otras similares)

    CASE lkey WHEN lkey > 5 THEN
        lkey + 2
    ELSE
        lkey
    END

Es

    CASE WHEN [condition] THEN [expression] ELSE [expression] END

O

    CASE [expression] WHEN [value] THEN [expression] ELSE [expression] END

Así que en su caso se leería:

    CASE WHEN lkey > 5 THEN
        lkey + 2
    ELSE
        lkey
    END

Echa un vistazo a la documentación (La expresión CASE):

Http://www.sqlite.org/lang_expr.html

 75
Author: Lukas Eder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-11 12:27:27

Además, no tiene que usar casos anidados. Puede usar varias líneas WHEN-THEN y la línea ELSE también es opcional aunque la recomiendo

CASE 
   WHEN [condition.1] THEN [expression.1]
   WHEN [condition.2] THEN [expression.2]
   ...
   WHEN [condition.n] THEN [expression.n]
   ELSE [expression] 
END
 28
Author: Hrusilov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-08 15:18:09