2012-02-26 23 views
7

Czy mogę utworzyć w SQLite taką instrukcję?Aktualizacja warunkowa w SQLite

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

Czy istnieje działająca na to składnia?

Odpowiedz

13

CASE oświadczenie powinno działać z następującą składnią:

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 że równe tym stwierdzeniem?

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

Edit:

według nowego rachunku:

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

@Phoenix Sure jest dla tego przykładu. –

+0

@Phoenix I nieco rozszerzyłem zdanie, ale myślę, że masz rację. – xralf

+0

@ To dobre rozwiązanie. Wolę zaakceptować drugą, ponieważ jest więcej wyraźnych semantyki (co chcę zrobić), gdy ktoś czyta mój kod. Ale czy Twoje rozwiązanie ma pewną przewagę (na przykład pod względem wydajności)? – xralf

1

Jeśli chcesz tylko warunkowo zaktualizować niektóre wiersze i pozostawić innym stanie nienaruszonym, to powinien zrobić:

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

Jeśli chcesz poprawić we wszystkich wierszach (z book_id = 10) do różnych wartości można użyć 2 instrukcji z "przeciwnymi" warunkami. Założenie 0 jest "inną" wartością, która wyglądałaby tak:

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 

Lub po prostu użyj CASE, jak sugerowali inni.