2016-06-03 6 views
0

나는이 쿼리가 :조건에 따라 여러 열을 업데이트하는 방법은 무엇입니까?

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) 

위의 두 쿼리의 조건은 동일합니다. 이들을 어떻게 혼합하여 하나의 쿼리로 만들 수 있습니까?

답변

2

첫 번째 쿼리가 이상하게 보입니다. 입력 변수에 userid의 혼합 비교를 사용하는 이유는 무엇입니까? 이거 할 생각이야?

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) 
+0

좋은 눈을 .. 또한 당신을 한 – stack

+0

.. 감사 두 번째 질의에서'user'를'id'로 대체해야합니다 * (당신이 말한대로) * – stack

관련 문제