简体   繁体   English

如何根据条件更新多个列?

[英]How to update multiple columns based on condition?

I have this query: 我有这个查询:

UPDATE user
   SET reputation = reputation + 
                    (CASE id WHEN :op   THEN 2 
                             WHEN :user THEN 15 
                     END)
WHERE user in (:user, :op)

And I also want to update one more column based on those conditions of that CASE() function. 而且我还想根据CASE()函数的条件再更新一列。 Currently I do that by another query: 目前,我通过另一个查询来做到这一点:

UPDATE user
   SET fee = fee + 
             (CASE id WHEN :op   THEN (SELECT SUM(op_val) FROM money WHERE id = :post_id)
                      WHEN :user THEN (SELECT SUM(user_val) FROM money WHERE id = :post_id)
              END)
WHERE user in (:user, :op)

Well as you see the conditions of those two queries above are identical. 正如您所看到的,以上两个查询的条件相同。 How can I mix them and make a single query instead? 如何混合它们并进行单个查询?

Your first query looks strange. 您的第一个查询看起来很奇怪。 Why would use mix comparisons of user and id to the input variables. 为什么要对输入变量使用userid混合比较。 Do you intend this? 你打算这样吗?

UPDATE user
   SET reputation = reputation + 
                    (CASE id WHEN :op   THEN 2 
                             WHEN :user THEN 15 
                     END)
WHERE id in (:user, :op);

A set clause can set multiple columns: set子句可以设置多个列:

UPDATE user
    SET reputation = reputation + 
                        (CASE user WHEN :op   THEN 2 
                                   WHEN :user THEN 15 
                         END),
        fee = fee + 
             (CASE user WHEN :op   THEN (SELECT SUM(op_val) FROM money WHERE id = :post_id)
                        WHEN :user THEN (SELECT SUM(user_val) FROM money WHERE id = :post_id)
              END)
WHERE user in (:user, :op);

You can also write the second condition as: 您还可以将第二个条件写为:

        fee = fee + 
             (SELECT SUM(CASE id WHEN :op THEN op_val ELSE user_val END) FROM money WHERE id = :post_id)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM