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
'프로그래밍 > oracle' 카테고리의 다른 글
oracle - Nested Loop Join과 Sort Merge Join (0) | 2012.08.17 |
---|---|
oracle - mysql to oracle(perl) (0) | 2012.08.17 |
Oracle - Index와 관련된 힌트들 (0) | 2012.08.17 |
oracle - 오라클(ORACLE) DB사전(DICTIONARY) 정리 (0) | 2012.08.17 |
oracle - DB 링크 및 스냅샷 (0) | 2012.08.17 |