💾DB

[ORACLE] DECODE와 CASE

이줭 2023. 6. 19. 10:20
728x90

ORACLE의 DECODECASE에 대해 알아보자 🤓

DECODE와 CASE는 SQL에서 조건에 해당하는 값을 추출할 때 사용한다.

DECODE

조건에 따라 데이터를 다른 값이나 컬럼 값으로 추출할 수 있으며, DECODE(VALUE, COND1, THEN1, COND2, THEN2, ...) 형태로 사용할 수 있다.

 

VALUE == COND1 일 경우 THEN1 반환, VALUE == COND2 일 경우 THEN2 반환한다. DECODE 내에 DECODE를 중첩하여 사용 가능하고 일반적으로 아래와 같이 사용된다.

SELECT DEPT_CODE
, DECODE(DEPT_CODE
, 10, 'SALES'
, 20, 'ACCOUNTING'
, 30, 'HR') AS DEPT_NAME
FROM DEPT
         
DEPT_CODE DEPT_NAME
--------- -----------
10         SALES
20         ACCOUNTING
30         HR

CASE

CASE 또한 DECODE와 마찬가지로 조건에 따라 데이터를 추출 할 수 있는 것은 동일하지만, DECODE가 제공하지 못하는 비교 연산의 단점을 해결 할 수 있다.

 

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

 

CASE VALUE WHEN COND1 THEN RES1 WHEN COND2 THEN RES2 ELSE RES3 형태로 사용할 수 있다. 위의 DECODE 예제를 CASE로 변환하면 아래와 같다.

SELECT DEPT_CODE
, CASE DEPT_CODE
    WHEN 10 THEN 'SALES'
    WHEN 20 THEN 'ACCOUNTING'
    WHEN 30 THEN 'HR'
    ELSE 'OPER'
    END AS DEPT_NAME
FROM DEPT

DEPT_CODE DEPT_NAME
--------- ---------
10         SALES
20         ACCOUNTING
30         HR
40         OPER

 

그래서 그놈이 그놈인가? 🤔

 

사실 CASE는 STATEMENT이고, DECODE는 FUNCTION이다. CASE가 FUNCTION이 아니라네....😮

따라서, CASE는 SQL과 PL/SQL에서 모두 사용 가능 하지만, DECODE는 SQL에서만 사용 가능하다.

 

단순 쿼리 성능상의 차이는 없지만, NULL과 NULL 비교 시 DECODE는 TRUE, CASE는 FALSE를 반환한다. 따라서, CASE문으로 NULL 비교 연산 시 쿼리 작성에 주의가 필요하다.

 

추가적으로, 위에서 언급 했듯이 DECODE는 등가 연산만 가능하지만, CASE는 다양한 비교 연산이 가능하다.

 

DECODE를 사용하면 간단한 쿼리문에서는 길이가 훨씬 짧아 단순 등가 비교에서는 DECODE, 조금 복잡한 조건이 필요하면 CASE를 쓰는 것이 좋을 것 같다.

 

참고 : http://www.gurubee.net/lecture/1028

https://dorongdogfoot.tistory.com/79

728x90