IT/DB

Oracle - DECODE문

Normal_One 2017. 3. 5. 16:56

 저번엔 CASE WHEN에 대해서 알아 보았습니다. 이번엔 그와 유사하지만 다른 DECODE에 대해 다루어 보자고 합니다. DECODE의 기본 형태는 다음과 같습니다.


DECODE(조건값, 비교값1, 결과값1,
                            비교값2, 결과값2,
                            비교값3, 결과값3,
                            ...
                            비교값n, 결과값n, 결과값)

 제일 처음에 넣어준 조건값이 뒤에 넣어준 비교값과 일치할 시에 결과값을 출력하도록 되어 있습니다. 가장 마지막에 넣어 준 결과값은 앞의 결과들이 모두 일치하지 않을 시에 넣어줄 결과값입니다. 그럼 실제로는 어떻게 쓰이는지 한번 보도록 하겠습니다. 지금 사용 된 쿼리들은 Oracle에 기본적으로 제공되는 EMPLOYEES를 상대로 작성하였음을 알려 드립니다.

1
2
3
4
5
6
7
SElECT FIRST_NAME, 
       LAST_NAME, 
       DEPARTMENT_ID, 
       DECODE(DEPARTMENT_ID, 10'ACCOUNTING'
                           , 20'SALES'
                           , 30'IT_PROGRAMER''CLERK') AS DEPARTMENT_NAME 
       FROM EMPLOYEES;
cs

 위 예제는 DEPARTMENT_ID가 10일 때는 부서 이름이 'ACCOUNTING'으로, 20일 때는 'SALES'로 30일 때는 'IT_PROGRAMER'로 그 외 일때는 'CLERK'으로 나오도록 하게 만든 문입니다(실제 데이터 값이랑 다릅니다).

1
2
3
4
SELECT * FROM EMPLOYEES                 
        WHERE SALARY > 10000                      
        AND DECODE(DEPARTMENT_ID, 100, LAST_NAME, FIRST_NAME) 
        LIKE '%b%';
cs

 위 예제는 Salary값이 10000초과일 때 Department_id가 90이하면 First_name에서 Salary값이 100일 때는 Last_name에서 'b'라는 철자가 포함 된 사람을 찾도록 했습니다. WHERE절에서 사용 방법을 보여드리기 위해서 작성했습니다.
 밑에 쓴 쿼리는 CASE WHEN문을 위해서 좀 어거지로 만든 쿼리이긴 합니다. 왜냐하면 어떤게 더 빠른가를 시험해 보기 위해서인데, 둘다 실행해보니 동일하게 18~20mses의 속도를 보였습니다. 따라서, 뭐 별 달리 성능 차이를 느낄 수 없다고 하면 될 것 같습니다. 다만 CASE WHEN과는 다르게 DECODE에서 조건문을 쓰려면 GREATEST나 LEAST와 같은 함수를 써야 하는데 CASE WHEN에서는 연산자를 사용 가능하니 뭐 CASE WHEN이 더 쓰임새가 많다고 볼 수 있을 것 같습니다.