CASE

설명

CASE 연산식은 IFTHENELSE 로직을 SQL 문장으로 표현하며, WHEN에 지정된 비교 연산 결과가 참이면 THEN 절의 값을 반환하고 거짓이면 ELSE 절에 명시된 값을 반환한다. 만약, ELSE 절이 없다면 NULL 값을 반환한다.

구문

CASE control_expression simple_when_list

[ else_clause ]

END

 

CASE searched_when_list

[ else_clause ]

END

 

simple_when :

WHEN expression THEN result

 

searched_when :

WHEN search_condition THEN result

 

else_clause :

ELSE result

 

result :

expression | NULL

CASE 문은 반드시 키워드 END로 끝나야 하며, control_expression과 데이터 타입과 simple_when 절 내의 expression은 비교 가능한 데이터 타입이어야 한다. 또한, THENELSE 절에 지정된 모든 result의 데이터 타입은 서로 같거나, 어느 하나의 공통 데이터 타입으로 변환 가능(convertible)해야 한다.

CASE 수식이 반환하는 값의 데이터 타입은 다음과 같은 규칙에 따라 결정된다.

예제

--creating a table

CREATE TABLE case_tbl( a INT);

INSERT INTO case_tbl VALUES (1);

INSERT INTO case_tbl VALUES (2);

INSERT INTO case_tbl VALUES (3);

INSERT INTO case_tbl VALUES (NULL);

 

--case operation with a search when clause

SELECT a,

       CASE WHEN a=1 THEN 'one'

            WHEN a=2 THEN 'two'

            ELSE 'other'

       END

FROM case_tbl;

 

===================================

            1  'one'

            2  'two'

            3  'other'

         NULL  'other'

 

--case operation with a simple when clause

SELECT a,

       CASE a WHEN 1 THEN 'one'

              WHEN 2 THEN 'two'

              ELSE 'other'

       END

FROM case_tbl;

 

===================================

            1  'one'

            2  'two'

            3  'other'

         NULL  'other'

 

 

--result types are converted to a single type containing all of significant figures

SELECT a,

       CASE WHEN a=1 THEN 1

            WHEN a=2 THEN 1.2345

            ELSE 1.234567890

       END

FROM case_tbl;

 

===================================

            1  1.000000000

            2  1.234500000

            3  1.234567890

         NULL  1.234567890

 

--an error occurs when result types are not convertible

SELECT a,

       CASE WHEN a=1 THEN 'one'

            WHEN a=2 THEN 'two'

            ELSE 1.2345

       END

FROM case_tbl;

===================================

ERROR