shop-wiz logo
Follow Us on Facebook Follow Us on Google+ Follow Us on Twitter Follow Us on LinkedIn

 

MERGE

 - 한번에 조건에 따라 INSERT,UPDATE 가 가능합니다.
 - 해당 ROW가 있으면 UPDATE, 없으면 INSERT 문장이 실행 됩니다.
 
 
 ◈syntax
MERGE INTO target_table_name
      USING (table|view|subquery) ON (join condition)
WHEN MATCHED THEN
     UPDATE SET col1 = val1[, col2 = val2…]
WHEN NOT MATCHED THEN
     INSERT(...) VALUES(...)
 

 ◈ 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가 없을 때 수행할 내용
 
 
-- scott유저로 접속
C:\>SQLPLUS scott/tiger
 
-- 테스트를 위한 테이블 생성
SQL>CREATE TABLE emp_test
    AS SELECT * FROM emp WHERE deptno = 10;
 
-- 부서번호가 10인 사원만 데이터가 생성되었습니다.
SQL>SELECT empno, ename, sal FROM emp_test
EMPNO ENAME        SAL
----- ---------- -----
 7782 CLARK       2450
 7839 KING        5000
 7934 MILLER      1300
 
 
-- 간단하게 emp_test테이블에 데이터가 있으면 급여를 10%인상하고 없으면
-- 새로 INSERT하는 예제 입니다
.
SQL>MERGE INTO emp_test et
    USING emp e
    ON(et.empno = e.empno)
 WHEN MATCHED THEN
    UPDATE SET et.sal = e.sal*1.1
 WHEN NOT MATCHED THEN
    INSERT VALUES (e.empno,e.ename,e.job,e.mgr,e.hiredate,e.sal,e.comm,e.deptno)
14 행이 병합되었습니다.
 
 
-- 실행결과를 조회 해 봅니다.
SQL>SELECT empno, ename, sal FROM emp_test
EMPNO ENAME        SAL
----- ---------- -----
 7782 CLARK       2695
 7839 KING        5500
 7934 MILLER      1430
 7844 TURNER      1500
 7521 WARD        1250
 7654 MARTIN      1250
 7788 SCOTT       3000
 7698 BLAKE       2850
 7566 JONES       2975
 7499 ALLEN       1600
 7902 FORD        3000
 ...
14 개의 행이 선택되었습니다.


CASE 문장
 
  - Case문은 8.1.7에서부터 지원되었으며, 9i에서는 SQL에서뿐만 아니라  PL/SQL에서도 지원 됩니다
 
 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
 

COALESCE
 
  - COALESCE(expr1,expr2,expr3,…)
  - expr1이 NULL이 아니면 expr1값을 그렇지 않으면 COALESCE(expr2,expr3,…)값을 반환 합니다.
  - NVL function과 비슷 합니다.
  - CASE WHEN expr1 IS NOT NULL
          THEN expr1
          ELSE COALESCE(expr2,expr3,…)
     END
 
-- 아래 문장을 실행시켜 보세요.
SQL>SELECT COALESCE(comm,1) FROM emp

 

Powered by shop-wiz since 2002, e-mail:wangta69@naver.com