yeoseon / tip-archive

트러블 슈팅 및 팁을 모아두는 레포 (Today I Learned)

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

[SQL] CASE..WHEN...THEN 문

yeoseon opened this issue · comments

Where 문의 한계

Where문을 통해 조건을 설정할 수 있지만,
가져온 값에 어떤 조건을 걸어 보여주거나 값을 변환해서 가져올 필요가 있다.
이때는 CASE..WHEN..THEN문을 사용한다.

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

사용방법 1

CASE 와 WHEN 사이에 비교하고자 하는 Column 을 넣고
WHEN 과 THEN 사이에 비교하고자 하는 값을 넣어서 비교하는 방법

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;

사용방법 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;

중첩 Case문

Case 문을 중첩하여 사용할 수 있다.

SELECT  T1.STORE_ID
        ,T1.STORE_ADDR
        ,CASE WHEN T1.STORE_SIZE >= 100 THEN
                CASE WHEN T2.REGION_GD IN ('S') THEN 'High grade'
                     WHEN T2.REGION_GD IN ('A','B') THEN 'Mid Grade'
                     ELSE 'Low Grade'
                END
              WHEN T1.STORE_SIZE >= 50 THEN
                CASE WHEN T2.REGION_GD IN ('S', 'A') THEN 'High Grade'
                     WHEN T2.REGION_GD IN ('B') THEN 'Mid Grade'
                     ELSE 'Low Grade'
                END
             ELSE
                CASE WHEN T2.REGION_GD IN ('S', 'A', 'B') THEN 'High Grade'
                     ELSE 'Low Grade'
                END
        END STORE_SIZE_GD
FROM    SQL_TEST.MA_STORE T1
        ,SQL_TEST.CD_REGION T2
WHERE   T1.REGION_CD = T2.REGION_CD

Reference