2012-02-26 92 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。