2012-02-26 20 views
7

Posso creare in SQLite una dichiarazione come questa?Aggiornamento condizionale in SQLite

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

Esiste una sintassi di lavoro per questo?

risposta

13

Una dichiarazione CASE dovrebbe funzionare con la seguente sintassi:

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

Isnt che uguale a questa affermazione?

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

Edit:

secondo una nuova dichiarazione:

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

@Phoenix Sure è, per questo esempio. –

+0

@Phoenix Ho esteso la frase un po ', ma penso che tu abbia ragione. – xralf

+0

@ È una buona soluzione. Preferirei accettare l'altro perché c'è una semantica più chiara (quello che voglio fare) quando qualcuno legge il mio codice. Ma la tua soluzione ha qualche vantaggio (ad esempio in termini di prestazioni)? – xralf

1

Se si desidera semplicemente aggiornare condizionale alcune righe e lasciare intatti gli altri, questo dovrebbe fare:

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

Se si desidera aggiornare mangiato tutte le righe (con book_id = 10) su valori diversi, è possibile utilizzare 2 istruzioni con condizioni "opposte". Supponendo 0 è l ' "altro" valore, che sarebbe simile a questa:

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 semplicemente usare CASE come altri hanno suggerito.

Problemi correlati