오라클 케이스 표현식 (Oracle Case Expressions)

오라클 케이스 표현식에 대해 알아보도록 합시다. 케이스 표현식은 디코드 함수와 함께 오라클에서 조건절을 설정할 수 있도록 지원하는 유용한 도구입니다. 그리고 케이스는 사용하는 방법에 따라 크게 2가지로 나눌 수 있는데요, 다음과 같은 목차로 케이스 표현식을 이해해 보도록 하겠습니다.

  • Case Expressions
  • Simple Case Expression
  • Searched Case Expression

케이스 표현식 : Case Expressions

오라클은 IF와 같은 조건식을 CASE문으로 표현할 수 있습니다. 다음은 오라클 케이스 표현식에 대해 간단한 안내입니다.

  • CASE문은 심플 케이스, 서치드 케이스 형태로 사용이 가능합니다. 이번 게시물의 핵심 주제이며 아래에서 하나씩 설명드리도록 하겠습니다.
  • CASE로 시작하여 END로 종료하며 ELSE표현을 추가할 수 있습니다. ELSE를 생략하는 경우, 해당 조건은 NULL을 반환합니다.
  • CASE문 안에 다시 CASE를 하는 것 역시 가능합니다.

Oracle Case Expressions

해당 내용을 하나의 예시에 담아보았습니다. (밑에서 설명 드릴게요.)

  SELECT JOB,
         SAL,
         CASE JOB
            WHEN (SELECT 'CLERK' FROM DUAL) THEN 'Job is CLERK'
            WHEN 'MANAGER' THEN 'Job is MANAGER'
         END
            "Is Job CLERK, or MANAGER?",
         CASE
            WHEN JOB = 'CLERK' OR JOB = 'ANALYST'
            THEN
               CASE
                  WHEN SAL >= 1000
                  THEN
                     'Job is CLERK/ANALYST and Sal is more than 1000'
                  ELSE
                     'Job is CLERK/ANALYST and Sal is less than 1000'
               END
            ELSE
               'Job is ' || JOB
         END
            AS "Job and Sal"
    FROM EMP
ORDER BY JOB, SAL

심플 케이스 : Simple Case Expression

심플 케이스는 다음과 같이 사용합니다.

CASE simple_case_expr
    WHEN THEN
    [ELSE]
END

칼럼 또는 스칼라 서브쿼리 등을 활용할 때 사용합니다.

CASE문과 비슷한 DECODE함수를 CASE로 변환할 때에도 이용이 가능합니다.

Oracle Simple Case

  SELECT JOB,
         SAL,
         CASE JOB
            WHEN (SELECT 'CLERK' FROM DUAL) THEN 'Job is CLERK'
            WHEN 'MANAGER' THEN 'Job is MANAGER'
         END
            "Is Job CLERK, or MANAGER?"
    FROM EMP
ORDER BY JOB, SAL;

[JOB] 칼럼이 CLERK(스칼라) 인 경우, MANAGER인 경우, 그리고 ELSE문을 생략하여 NULL을 반환하도록 하였습니다.

서치드 케이스 : Searched Case Expression

서치드 케이스는 다음과 같이 사용합니다.

CASE
    WHEN searched_case_expr THEN
    [ELSE]
END

여러 조건이 가능하기에 심플보다 널리 활용하는 편입니다.

대부분의 CASE문은 이 형태로 사용하는 경우가 많습니다.

Oracle Searched Case

SELECT JOB,
         SAL,        
         CASE
            WHEN JOB = 'CLERK' OR JOB = 'ANALYST'
            THEN
               CASE
                  WHEN SAL >= 1000
                  THEN
                     'Job is CLERK/ANALYST and Sal is more than 1000'
                  ELSE
                     'Job is CLERK/ANALYST and Sal is less than 1000'
               END
            ELSE
               'Job is ' || JOB
         END
            AS "Job and Sal"
    FROM EMP
ORDER BY JOB, SAL;

[JOB] 칼럼이 CLERK 이거나 ANALYST인 경우, SAL 이 1000 이상인지 미만인지 확인하도록 합니다.

CASE의 이중사용과 ELSE 부분을 확인하실 수 있습니다.

댓글