2012-02-26 47 views
7

我可以在SQLite中創建類似的語句嗎?SQLite中的條件更新

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

是否有此工作的語法?

回答

13

一個CASE語句應使用以下語法工作:

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

心不是說等於這個說法?

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

編輯:

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

@Phoenix當然,就這個例子而言。 – 2012-02-26 14:06:01

+0

@Phoenix我稍微擴展了這個陳述,但認爲你是對的。 – xralf 2012-02-26 14:08:41

+0

@這是一個很好的解決方案。我寧願接受另一個,因爲當有人讀取我的代碼時,會有更清晰的語義(我想要做什麼)。但是你的解決方案有哪些優勢(例如性能)? – xralf 2012-02-26 14:13:54

1

如果你只是想有條件地更新一些行,讓別人完好無損,這應該這樣做::

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

根據新的語句

如果你想更新將所有行(使用book_id = 10)都改爲不同的值,則可以使用2條語句和「相反」條件。假設0是「其他」值,那看起來應該是這樣的:

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 

或者只是像其他人所建議的那樣使用CASE。