2012-02-26 9 views
7

¿Puedo crear en SQLite una declaración como esta?Actualización condicional en SQLite

update books set 
(if number_of_pages > 0 then number_of_pages = number_of_pages - 1) 
where book_id = 10 

¿Existe una sintaxis de trabajo para esto?

Respuesta

13

Una declaración CASE debe trabajar con la siguiente sintaxis:

UPDATE 
    books 
SET number_of_page = CASE WHEN number_of_pages > 0 THEN (number_of_pages - 1) ELSE 0 END 
WHERE whatever_condition 
4

No es eso igual a esta declaración?

update books set number_of_pages = number_of_pages - 1 where number_of_pages>0 

Editar:

según una nueva declaración:

update books set number_of_pages = number_of_pages - 1 where number_of_pages>0 and book_id = 10 
+0

@Phoenix Claro que sí, para este ejemplo. –

+0

@Phoenix Extendí un poco la declaración, pero creo que tiene razón. – xralf

+0

@ Es una buena solución. Preferiría aceptar el otro porque hay una semántica más clara (lo que quiero hacer) cuando alguien lee mi código. Pero, ¿tiene su solución alguna ventaja (por ejemplo, en rendimiento)? – xralf

1

Si lo que desea es actualizar condicionalmente algunas filas y dejar los demás intacta, esto debería hacer:

update books 
set number_of_pages = number_of_pages - 1 
where number_of_pages > 0 AND book_id = 10 

Si desea actualizar comió todas las filas (con book_id = 10) a diferentes valores, puede usar 2 instrucciones con condiciones "opuestas". Suponiendo 0 es el "otro" valor, que se vería así:

update books 
set number_of_pages = number_of_pages - 1 
where number_of_pages > 0 AND book_id = 10 

update books 
set number_of_pages = 0 
where number_of_pages <= 0 AND book_id = 10 

o simplemente utilizar CASE como han sugerido otros.