본문 바로가기

프로그래밍/oracle

oracle - MERGE/ CASE/ NULLIF

반응형

MERGE/ CASE/ NULLIF   



▶  테스트를 위한 테이블 생성

 - 완전히 똑같은 테이블이 생성되는 것은 아니다. (데이터 백업용으로 적합할듯)

CREATE TABLE emp_test

AS SELECT * FROM emp WHERE deptno = 10;

 

▶  MERGE

 - 한번에 조건에 따라 INSERT,UPDATE 가 가능합니다.

 - 해당 ROW가 있으면 UPDATE, 없으면 INSERT 문장이 실행 됩니다.


 ◈ syntax 설명

 - INTO : DATA가 UPDATE되거나 INSERT될 TABLE이름을 지정 합니다. 

 - USING : 대상 TABLE의 DATA와 비교한 후 UPDATE 또는 INSERT할 대상이 되는 DATA의 SOURCE 테이블 또는 뷰를 지정

 - ON  : UPDATE나 INSERT를 하게 될 조건으로, 해당 condition을 만족하는 DATA가 있으면 WHEN MATCHED 절을 

   실행하게 되 고, 없으면 WHEN NOT MATCHED 이하를 실행하게 됩니다. 

 - WHEN MATCHED : ON 조건절이 TRUE인 ROW에 수행 할 내용 

 - WHEN NOT MATCHED : ON 조건절에 맞는 ROW가 없을 때 수행할 내용 

 MERGE INTO SLFANDUTORG_TEST et

    USING SLFANDUTORG_TEST E // 본 예제는 테이블간 비교가 아니기에 여기서 사용된 테이블은 형식을 맞추기위함

    ON(et.DUT_ORG_CODE <> 'A01') // 조건은 '='나 '<>'사용하면된다.


 WHEN MATCHED THEN 

    UPDATE SET REM = 'TEST1' // 항상 업데이트문이 와야한다.


 WHEN NOT MATCHED THEN 

    INSERT VALUES ('001','본사','on','1','','110000','20060913','서울',

    '0','이강동구','A','011-111-1111','1010','1210') // 직접 값을 써주었지만. 해담 컬럼명을 써주어도 된다.

 

▶  CASE

 1) simple CASE expression

  - DECODE 함수와 비슷하다고 보시면 됩니다. 

    SQL>SELECT deptno, CASE deptno

               WHEN 10 THEN 'ACCOUNTING'

               WHEN 20 THEN 'RESEARCH'

               WHEN 30 THEN 'SALES'

               ELSE 'OPERATIONS'

            END as "Dept Name"

        FROM emp

    

    

 2) searched CASE expression

  - IF.. THEN .. ELSE 구문과 비슷 합니다.

  - WHEN절 다음에 여러 조건이 올 수 있습니다.

    SQL>INSERT INTO raise

    SELECT last_name ,

           CASE

              WHEN job_id LIKE 'AD%' THEN '10%'

              WHEN job_id LIKE 'IT%' THEN '15%'

              WHEN job_id LIKE 'PU%' THEN '18%'

              ELSE '20%'

           END

    FROM employees ;

 

▶  NULLIF 

  - NULLIF(exp1, exp2)

  - exp1값과 exp2값이 동일하면 NULL을 그렇지 않으면 exp1을 반환 합니다.

  - exp1는 NULL이 올 수 없습니다.

  - CASE WHEN expr1 = expr2

         THEN NULL

         ELSE expr1

    END  


    SQL>SELECT DUT_ORG_CODE,

    CASE WHEN DUT_ORG_CODE = 'A01'

         THEN (SELECT DUT_ORG_NM || '이지롱' FROM SLFANDUTORG WHERE DUT_ORG_CODE = 'A01')

         ELSE 'B01'

    END AS TEST

    FROM SLFANDUTORG

  


반응형