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?
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?
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
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
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.
@Phoenix Sure jest dla tego przykładu. –
@Phoenix I nieco rozszerzyłem zdanie, ale myślę, że masz rację. – xralf
@ 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