본문 바로가기
Server/Oracle

(스크랩) [Oracle] CASE, WHEN, THEN

by 뒹굴거리는프로도 2017. 12. 26.
반응형

 


CASE, WHEN, THEN (조회된 값에 대한 조건 걸기)


조회해 올 때의 조건은 WHERE 문으로 조건을 걸어 가져올 수 있습니다.

하지만 가져온 값에 어떤 조건을 걸어 보여주거나, 또는 값을 변환할 필요가 있을 경우는 CASE, WHEN, THEN문을 씁니다.

CASE WHEN문에는 두 가지 형태의 사용 방법이 있습니다.

SELECT * FROM table명 
WHERE column명 <!--검색할 컬럼명-->
CASE WHEN 'A'='B' <!--비교조건-->
THEN '2013'<!--처리조건-->
ELSE 'C' <!--default조건-->
END <!--반드시 끝에 END를 써야한다 -->
 

 

1. 특정 column으로 여러가지 값을 비교


CASE와 WHEN사이에 비교하고자 하는 column을 넣고, WHEN과 THEN 사이에 비교하고자 하는 값을 넣어서 비교하는 방법입니다.

SELECT CASE TO_CHAR(SYSDATE, 'YYYY') 
WHEN '2013' THEN SYSDATE
WHEN '2014' THEN SYSDATE + 1
ELSE NULL END SYS_DATE
FROM DUAL;

 

2. 여러가지 조건을 비교


CASE와 WHEN 사이는 비우고(컬럼 없음), WHEN과 THEN 사이에 내가 필요한 조건문을 WHERE절에 넣는 것처럼 넣으면 됩니다.

2번의 경우에는 하나의 조건 뿐만 아니라, 여러개의 조건을 한꺼번에 넣을 수 있는 장점이 있습니다.

SELECT 
CASE WHEN TO_CHAR(SYSDATE, 'YYYY') = '2013'
THEN SYSDATE
WHEN TO_CHAR(SYSDATE, 'MM') = '11'
THEN SYSDATE + 1
ELSE NULL END SYS_DATE
FROM DUAL;
SELECT CASE 
  WHEN TO_CHAR(SYSDATE, 'YYYY') = '2013'
  AND TO_CHAR(SYSDATE, 'MM') = '10' THEN SYSDATE
  WHEN TO_CHAR(SYSDATE, 'YYYY') = '2014'
  OR TO_CHAR(SYSDATE, 'MM') = '11' THEN SYSDATE + 1
  ELSE NULL END SYSDATE
FROM DAUL;
 

이상 조회된 값에 조건 걸어 사용하기 였습니다.

 

3. DECODE와 CASE


DECODE와 CASE 함수는 SQL 문장에서 조건에 해당하는 값을 추출하고자 할 때 주로 사용한다.

 

(1) DECODE

  • DECODE 함수는 조건에 따라 데이터를 다른 값이나 컬럼값으로 추출 할 수 있다.
  • DECODE(VALUE, IF1, THEN1, IF2, THEN2 ...) 형태로 사용할 수 있다.
  • VALUE값이 IF1일 경우에 THEN1값을 반환하고, VALUE값이 IF2일 경우에 THEN2를 반환한다.
  • DECODE 함수 안에 DECODE 함수를 중첩으로 사용할 수 있다.

 

아래는 DECODE 함수의 일반적인 예제이다.

ex) 부서번호가 10이면 ACCOUNTING, 20이면 RESEARCH, 30이면 SALES. 나머지는 OPERATIONS를 출력하는 예제

SELECT 
    depthno, 
    DECODE (depthno, 10, 'ACCOUNTING',
            20, 'RESEARCH',
            30, 'SALES', 'OPERATIONS')name
FROM dept;
DEPTNO    NAME

------ ----------

10    ACCOUNTING

20    RESEARCH

30    SALES

40    OPERATIONS
 

ex) 아래는 DECODE 함수에서 집계 함수를 사용한 예제이다. 10 부서는 급여 합계, 20 부서는 최댓값, 30 부서는 최솟값을 출력하는 예제

SELECT depthno,
DECODE(depthno, 10, SUM(sal),
        20, MAX(sal),
        30, MIN(sal))sal
FROM emp
GROUP BY depthno;
 
DEPTNO      SAL

--------- --------

30          950

20          3000

10          8750

 

DECODE 함수는 집계함수과 함께 통계 데이터를 추출 할 때 많이 사용한다. 아래는 부서별로 급여합계를 조회하는 예이다.

ex)부서별로 급여 합계를 출력한다.

SELECT deptno, NVL(SUM(DECODE(deptno, 10, sal)), 0) deptno10,
                NVL(SUM(DECODE(deptno, 20, sal)), 0) deptno20,
                NVL(SUM(DECODE(deptno, 30, sal)), 0) deptno30,
                 NVL(SUM(DECODE(deptno, 40, sal)), 0) deptno40
FROM emp,
GROUP BY deptno;
 
DEPTNO   DEPTNO10   DEPTNO20   DEPTNO30   DEPTNO40

------- --------- --------- ---------- ----------

30         0           0        9400         0

20         0         10875        0          0

10        8750         0          0          0

 

아래 부서별 급여합계 예를 보면 일반적인 집계 함수를 사용할 때는 급여 합계가 행으로 조회 되지만, DECODE와 MAX함수를 사용하면 열로 값을 표시할 수 있다.

ex) 부서별로 급여 합계를 행으로 출력한다.

SELECT d.deptno, NVL(SUM(e.sal), 0) sal
FROM emp e, dept d
WHERE e.deptno(+) = d.deptno
GROUP BY d.deptno;

<!--------------------------------------->


DEPTNO    SAL

-------- ----------

10        8750

20        10875

30        9400

40        0
 

ex) 부서별로 급여 합계를 열로 출력한다.

SELECT MAX(NVL(SUM(DECODE(deptno, 10, sal)), 0)) deptno10,
       MAX(NVL(SUM(DECODE(deptno, 20, sal)), 0)) deptno20,
       MAX(NVL(SUM(DECODE(deptno, 30, sal)), 0)) deptno30,
       MAX(NVL(SUM(DECODE(deptno, 40, sal)), 0)) deptno40
FROM emp
GROUP BY deptno;

<!--------------------------------------------------------->
DEPTNO10   DEPTNO20   DEPTNO30   DEPTNO40

--------- ---------- ---------- ----------
  8750      10875       9400        0
 

(2) CASE

CASE 함수는 DECODE 함수가 제공하지 못하는 비교 연산의 단점을 해결할 수 있는 함수이다.

DECODE함수에서 비교연산을 수행하기 위해서는 GREATEST, LEAST등의 함수를 사용해야 하지만, CASE함수에서는 조건 연산자를 모두 사용할 수 있다.

CASE 함수는 IF...THEN..ELSE 구문과 비숫하다. WHEN절 다음에 여러 조건이 올 수 있다.

 

 
 

 

 

 

 

 

 

 

 

출처) http://devbox.tistory.com/entry/DBMS-CASEWHENTHEN 

 

장인개발자를 꿈꾸는 :: 기록하는 공간

 

devbox.tistory.com

 

반응형