[MERGE문 문의 드립니다.]WHEN matched THEN UPDATE절을 여러개 사용할수 있는 방법이 있나요? 0 2 14,993

by 써니신랑 [SQL Query] MERGE ORACLE [2020.04.01 23:55:19]


MERGE INTO people_target pt 
USING people_source ps 
ON    (pt.person_id = ps.person_id) 
WHEN matched THEN UPDATE 
  SET pt.first_name = ps.first_name, 
      pt.last_name = ps.last_name, 
      pt.title = ps.title 
  DELETE where pt.title  = 'Mrs.' 
WHEN NOT matched THEN INSERT 
  (pt.person_id, pt.first_name, pt.last_name, pt.title) 
  VALUES (ps.person_id, ps.first_name, ps.last_name, ps.title) 
  WHERE ps.title = 'Mr';

이 상태로는 merge문 수행이 잘 되는것 같습니다.

한 가지 궁금한점은 여기에 추가로 WHEN matched THEN UPDATE를 여러개 사용할수 있는지 입니다.

아래처럼 WHEN matched 일때 특정 조건별로 여러개의 UPDATE문을 사용하는것이 가능한지 알고 싶습니다.

WHEN matched AND pt.first_name = 'AAA' THEN UPDATE
  SET pt.last_name = ps.last_name

WHEN matched AND pt.first_name = 'BBB' THEN UPDATE
  SET pt.first_name = ps.first_name

WHEN matched AND pt.first_name = 'CCC' THEN UPDATE
  SET pt.first_name = ps.first_name,
      pt.last_name = ps.last_name

실제 사용하는 로직은 조건별로 UPDATE 대상 컬럼, 로직이 복잡하여 조건별로 UPDATE절을 따로 만들어야 하는 상태입니다.

혹시 오라클에서는 이런식의 여러개 UPDATE절이 불가능한가요? 제가 MS-SQL은 가능하다고 본거 같아서요

 

 

by pajama [2020.04.02 08:27:44]

CASE문으로 가능하지 않을까요..?

MERGE INTO people_target pt 
USING people_source ps 
ON    (pt.person_id = ps.person_id) 
WHEN matched THEN UPDATE
  SET pt.last_name = CASE 
                       WHEN pt.first_name = 'AAA' THEN ps.last_name
                       WHEN pt.first_name = 'BBB' THEN pt.last_name
                       WHEN pt.first_name = 'CCC' THEN ps.last_name
                     END,
      pt.first_name = CASE 
                       WHEN pt.first_name = 'AAA' THEN pt.first_name
                       WHEN pt.first_name = 'BBB' THEN ps.first_name
                       WHEN pt.first_name = 'CCC' THEN ps.first_name
                      END;

 


by 마농 [2020.04.02 10:05:12]

구문은 문법에 맞게 써야 합니다. 맘대로 고쳐 쓸수는 없구요.
하나의 SQL 문장 안에서 조건에 따라 분기해야 한다면? CASE 문등을 사용할 수는 있겠죠.
프로그램에서 IF 문으로 분기하여 동적SQL 로 구성할수도 있구요.

WHEN matched THEN UPDATE
 SET pt.first_name = CASE WHEN pt.first_name IN ('BBB','CCC') THEN ps.first_name ELSE pt.first_name END
   , pt.last_name  = CASE WHEN pt.first_name IN ('AAA','CCC') THEN ps.last_name  ELSE pt.last_name  END

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입