2011-02-02 10 views
25

tengo el código de MySQL (Perl):SI() alternativa declaración en SQLite

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

necesito para utilizar este código con SQLite, pero no hay soporte de la función SI(). ¿Que puedo hacer?

Respuesta

52

Para SQL genérico puede utilizar CASE:

CASE se utiliza para proporcionar if-then-else tipo de lógica a SQL. Su sintaxis es:

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 sección "La expresión CASE"

P. ej

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

Otro enlace sobre SQLite & CASO (con ejemplo de actualización con subselección) http://sqlite.awardspace.info/syntax/sqlitepg09.htm

caso puede ser utilizado en ACTUALIZACIÓN en SQL genérico, pero no tengo ninguna información sobre el apoyo SQLite de cambios con el CASO

http://www.craigsmullins.com/ssu_0899.htm sección "Uso de expresiones caso cuando la modificación de datos"

+0

Gracias, pero lo necesito en la cláusula UPDATE – VeroLom

+1

VeroLom, solo pruébalo en ACTUALIZAR. CASE es parte del escaneo de expresiones básicas, no es parte de SELECT. – osgx

+0

Tengo SQLite pensando mucho tiempo sin resultado cuando uso el código "... lkey = CASE WHEN lkey => $ key THEN lkey + 2 ELSE lkey END ... – VeroLom

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

??? a

UPDATE pages 
SET lkey = lkey + 2 
WHERE rkey >= $key AND lkey >= $key 

UPDATE pages 
SET rkey = rkey + 2, 
WHERE rkey >= $key 

¿No es mejor?

Cuestiones relacionadas