Web/DB

[Oracle] DECODE, CASE WHEN

돈기법 2022. 3. 23. 16:09

- DECODE

사용방법

: DECODE (컬럼, 조건1, 결과1, 조건2, 결과2, 조건3, 결과3 ...)

 

ex) 1-1

WITH temp AS (   
    SELECT 'M' gender FROM dual UNION ALL   
    SELECT 'F' gender FROM dual UNION ALL   
    SELECT 'X' gender FROM dual  
)  
    
SELECT gender      
     , DECODE(gender, 'M', '남자', 'F', '여자', '기타') gender2   
  FROM temp

 

if (gender == "M") {
    return "남자";
} else if (gender == "F") {
    return "여자";
} else {
    return "기타";
}

 

GENDER GENDER2
M 남자
F 여자
X 기타

 

ex) 1-2

WITH temp AS (   
    SELECT 'M' gender FROM dual UNION ALL   
    SELECT 'F' gender FROM dual UNION ALL   
    SELECT 'X' gender FROM dual  
)  
    
SELECT gender      
     , DECODE(gender, 'M', '남자', 'F', '여자') gender2   
  FROM temp

else 부분은 생략이 가능하다. 해당 조건이 없으면 null 반환

GENDER GENDER2
M 남자
F 여자
X null

 

 

ex) 2

SELECT ENAME
	, COMM
    , DECODE (COMM, NULL, 'N', 'Y') COMM_YN
    FROM SCOTT.EMP
    WHERE EMPNO IN ('7839', '7566', '7499');

NVL 함수처럼 null 값을 체크하는 용도로도 쓸 수 있다.

ENAME COMM COMM_YN
ALLEN 300 Y
JONES - N
KING - N

COMM이 null이면 'N', 아니면 'Y'

 

 

DECODE 함수는 조건이 복잡해질 경우 가독성이 떨어짐.

CASE 표현식이 가독성이 좋고 더 많은 기능을 제공한다.

 

- CASE WHEN

사용방법

: CASE WHEN {조건} THEN {리턴 값}

         WHEN {조건} THEN {리턴 값}

         ELSE {값}

  END

 

ex) 1-1

SELECT ename
     , deptno
     , CASE WHEN deptno = '10' THEN 'New York'
            WHEN deptno = '20' THEN 'Dallas'
            ELSE 'Unknown'
       END AS loc_name
  FROM emp
 WHERE job = 'MANAGER'

 

if (deptno== '10') {
    return 'New York';
} else if (deptno == '20') {
    return 'Dallas';
} else {
    return 'Unknown';
}

 

ENAME DEPTNO LOC_NAME
BLAKE 30 Unknown
CLARK 10 New York
JONES 20 Dallas

else 부분은 생략이 가능하다. 해당 조건이 없으면 null 반환

 

ex) 1-2

SELECT ename
     , deptno
     , CASE deptno 
            WHEN 10 THEN 'New York'
            WHEN 20 THEN 'Dallas'
            ELSE 'Unknown'
       END AS loc_name
  FROM scott.emp
 WHERE job = 'MANAGER'

Switch문 방식으로도 사용 가능하다.

 

ex) 2

 SELECT ename
 	, sal
    	, CASE WHEN sal >= 2900 THEN '1등급'
    	  	   WHEN sal >= 2700 THEN '2등급'
          	   WHEN sal >= 2000 THEN '3등급'
     	  END AS sal_grade
 FROM emp a
 WHERE job = 'MANAGER'
 	AND (CASE WHEN sal >= 2900 THEN 1
    		  WHEN sal >= 2700 THEN 2
              WHEN sal >= 2000 THEN 3
         END) = 1

비교 연산자, 범위 연산자 사용이 가능하며, where절에서도 사용 가능하다.

그 외에도 오라클 내장 함수, 사용자 정의 함수도 조건으로 사용 가능하다.