我有这个问题:
UPDATE user
SET reputation = reputation +
(CASE id WHEN :op THEN 2
WHEN :user THEN 15
END)
WHERE user in (:user, :op)
我还希望根据CASE()
函数的条件再更新一列。目前我通过另一个查询来做到这一点:
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)
您看到上述两个查询的条件相同。我该如何混合它们并进行单一查询呢?
答案 0 :(得分:2)
您的第一个查询看起来很奇怪。为什么要将user
和id
的混合比较用于输入变量。你打算这个吗?
UPDATE user
SET reputation = reputation +
(CASE id WHEN :op THEN 2
WHEN :user THEN 15
END)
WHERE id in (:user, :op);
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);
您还可以将第二个条件写为:
fee = fee +
(SELECT SUM(CASE id WHEN :op THEN op_val ELSE user_val END) FROM money WHERE id = :post_id)