티스토리 뷰

IT/DB

Oracle - Case When문

Normal_One 2017. 3. 5. 16:54

 처음으로 데이터베이스를 작성하는군요. DB로는 지금하는 업무도 그렇고 교육센터에서 배울 때까지 쭉 Oracle만 다뤘습니다. Mysql도 할 줄 알아야 하는데, 뭐 워낙 서로 비슷하기 때문에 별로 걱정이 되진 않습니다. DB에 대해 설명할 때는 항상 Oracle에 기본적으로 있는 테이블인 EMPLOYEES 테이블로 예를 들도록 하겠습니다. 먼저 설명할 문은 Case when문입니다. 자바의 Case와 비슷한 구조입니다. 기본적인 형태는 다음과 같습니다.

CASE 컬럼명, 표현식
          WHEN 조건문1 THEN 결과값1
          WHEN 조건문2 THEN 결과값2
          WHEN 조건문3 THEN 결과값3
          ..
          ELSE 결과값
          END

 위 형태를 보시면 THEN 뒤에 제가 결과값이라고 적은 것을 볼 수 있는데, THEN뒤로는 식이 올 수 없기 때문에 결과값이라고 명시했습니다. 그럼 실제로는 어떻게 써야하는지 한번 보겠습니다. 지금 사용 된 쿼리들은 위에 설명했듯이 Oracle에 기본적으로 있는 테이블인 EMPLOYEES를 상대로 작성하였고 Toad에서 실행했음을 꼭 참조하시기 바랍니다.  

1
2
3
4
5
6
7
8
SELECT EMPLOYEE_ID, 
        FIRST_NAME,              
        LAST_NAME,              
        EMAIL,            
        CASE WHEN SALARY > 10000 THEN 'HIGH'                      
            WHEN SALARY <= 10000 THEN 'LOW'                      
        END AS SALARY_STATEMENT            
FROM EMPLOYEES;
cs
 
 위 쿼리는 Salary값이 10000초과일 때는 HIGH라는 값을, 10000이하일 때는 LOW라는 값을 출력하도록 한 예제입니다.

 

1
2
3
4
5
SELECT * FROM EMPLOYEES                 
        WHERE SALARY > 10000                      
        AND CASE WHEN DEPARTMENT_ID <= 90 THEN FIRST_NAME
                 WHEN DEPARTMENT_ID >= 100 THEN LAST_NAME                      
        END LIKE '%b%'-- like외에도 =등 어떤 조건을 적어도 무방하다.
cs

 위 쿼리는 Where절에서 Case when문을 쓴 형태입니다. Salary값이 10000초과일 때 Department_id가 90이하면 First_name에서 Salary값이 100이상일 때는 Last_name에서 'b'라는 철자가 포함 된 사람을 찾도록 했습니다. 저렇게 쿼리를 실행시키면 실제로 실행되는 쿼리는 Department_id가 90이하 일때는

1
2
3
 SELECT * FROM EMPLOYEES                 
        WHERE SALARY > 10000                 
        AND FIRST_NAME LIKE '%b%'
cs

Department_id가 100 이상일 때는

1
2
3
SELECT * FROM EMPLOYEES                 
        WHERE SALARY > 10000                 
        AND LAST_NAME LIKE '%b%'
cs

 을 실행하게 됩니다. 
 지금까지 Case when에 대해서 알아보았습니다. 그런데, 구글에 찾아보니 Case when은 DECODE 함수보다 DB에 주는 부하가 크다고 하는군요. 그래서 흥미로워서 더 찾아보니 아니라는 말도 있고 상황에 따라 다른 것 같았습니다. 그럼, 다음 번에는 Case when과 비슷하면서도 다른 DECODE 함수를 알아보도록 하겠습니다.

 

'IT > DB' 카테고리의 다른 글

Oracle - 다른 계정 table Truncate 시키기  (0) 2019.09.13
Oracle - ROWNUM 활용법  (0) 2017.07.30
Oracle - Paging 처리  (0) 2017.03.05
Oracle - Index 및 쿼리 성능 평가  (0) 2017.03.05
Oracle - DECODE문  (0) 2017.03.05
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday