카테고리:

조건식 함수

CASE

연속 《if-then-else》 문처럼 작동합니다. 보다 일반적인 형식에서는 일련의 조건이 순서대로 평가됩니다. 조건이 TRUE로 평가되면 평가가 중지되고 관련 결과(THEN 이후)가 반환됩니다. 어떤 조건도 TRUE로 평가되지 않는 경우, 선택적 ELSE 이후의 결과가 반환됩니다(있는 경우). 그렇지 않으면 NULL이 반환됩니다.

두 번째 《줄임》 형식의 경우, CASE 뒤의 식은 하나가 일치할 때까지 각 WHEN 식과 순서대로 비교됩니다. 그런 다음, 연결된 결과(THEN 이후)가 반환됩니다. 일치하는 식이 없으면 선택적 ELSE 이후의 결과가 반환됩니다(있는 경우). 그렇지 않으면 NULL이 반환됩니다.

두 번째 형식에서 NULL CASE 식은 WHEN 식 중 하나가 NULL인 경우에도 WHEN 식과 일치하지 않습니다.

참고 항목

IFF

구문

CASE
    WHEN <condition1> THEN <result1>
  [ WHEN <condition2> THEN <result2> ]
  [ ... ]
  [ ELSE <result3> ]
END

CASE <expr>
    WHEN <value1> THEN <result1>
  [ WHEN <value2> THEN <result2> ]
  [ ... ]
  [ ELSE <result3> ]
END

인자

condition#

CASE 의 첫 번째 형식에서 각 조건은 BOOLEAN 값(True, False 또는 NULL)으로 평가되어야 하는 식입니다.

expr

일반적인 식입니다.

value

CASE 의 두 번째 형식에서 각 valueexpr 과 일치할 가능성이 있습니다. value 은 리터럴 또는 식일 수 있습니다. valueexpr 과 동일한 데이터 타입이거나 expr 의 데이터 타입으로 캐스팅될 수 있는 데이터 타입이어야 합니다.

result#

CASE 절의 첫 번째 형식에서 condition# 가 true이면 함수는 해당 result# 를 반환합니다. 둘 이상의 조건이 true이면 첫 번째 true 조건과 관련된 결과가 반환됩니다.

CASE 문의 두 번째 형식에서 value#expr 과 일치하면 해당 result 가 반환됩니다. 둘 이상의 valueexpr 과 일치하면 첫 번째 일치 값의 result 가 반환됩니다.

결과는 단일 값으로 평가되는 식이어야 합니다.

CASE 의 두 형식 모두에서, 선택적 ELSE 절이 있고, 일치하는 항목이 없는 경우, 함수는 ELSE 절에 결과를 반환합니다. ELSE 절이 없고, 일치하는 항목이 없으면 결과는 NULL입니다.

사용법 노트

  • DECODE 와 달리 조건의 NULL 값은 조건의 다른 위치에 있는 NULL 값과 일치하지 않습니다. 예를 들어, WHEN <null_식> = NULL THEN 'Return me!' 은 《Return me!》를 반환하지 않습니다. NULL 값과 비교하려면 IS NULL 대신 = NULL 을 사용하십시오.

  • condition#, expr, value, result 는 모두 일반 식일 수 있으므로 UNION, INTERSECT, EXCEPT, MINUS 등의 세트 연산자를 포함하는 하위 쿼리를 포함할 수 있습니다. 세트 연산자를 사용할 때 데이터 타입이 호환되는지 확인하십시오. 자세한 내용은 세트 연산자 항목의 일반적인 사용법 노트 를 참조하십시오.

데이터 정렬 세부 정보

CASE 의 첫 번째 형식에서 각 식은 독립적이고, 다른 분기의 데이터 정렬 사양은 독립적입니다. 예를 들어, 다음에서 condition1 의 데이터 정렬 사양은 condition2 의 데이터 정렬 사양과 독립적이며, 이러한 데이터 정렬 사양은 동일하거나 호환될 필요도 없습니다.

CASE
    WHEN <condition1> THEN <result1>
  [ WHEN <condition2> THEN <result2> ]

CASE 의 두 번째 형식에서, 모든 데이터 정렬 관련 작업은 호환되는 데이터 정렬 사양을 사용해야 하지만, 데이터 정렬 사양이 동일할 필요는 없습니다. 예를 들어, 다음 문에서 value1value2 의 데이터 정렬 사양은 둘 다 expr 의 데이터 정렬 사양과 호환되어야 하지만, value1value2 의 데이터 정렬 사양은 서로 동일하거나 expr 의 데이터 정렬 사양과 동일할 필요는 없습니다.

CASE <expr>
    WHEN <value1> THEN <result1>
  [ WHEN <value2> THEN <result2> ]
  ...

함수에서 반환된 값은 THEN/ELSE 인자 중 가장 우선 순위 가 높은 데이터 정렬을 갖습니다.

이는 CASE 의 일반적인 사용을 보여줍니다.

SELECT
    column1,
    CASE
        WHEN column1=1 THEN 'one'
        WHEN column1=2 THEN 'two'
        ELSE 'other'
    END AS result
FROM (values(1),(2),(3)) v;

출력:

+---------+--------+
| COLUMN1 | RESULT |
|---------+--------|
|       1 | one    |
|       2 | two    |
|       3 | other  |
+---------+--------+

이는 일치하는 값이 없고 ELSE 절이 없는 경우, 반환된 값이 NULL임을 보여줍니다.

SELECT
    column1,
    CASE
        WHEN column1=1 THEN 'one'
        WHEN column1=2 THEN 'two'
    END AS result
FROM (values(1),(2),(3)) v;

출력:

+---------+--------+
| COLUMN1 | RESULT |
|---------+--------|
|       1 | one    |
|       2 | two    |
|       3 | NULL   |
+---------+--------+

이 예는 NULL을 명시적으로 처리합니다.

SELECT
    column1,
    CASE 
        WHEN column1 = 1 THEN 'one'
        WHEN column1 = 2 THEN 'two'
        WHEN column1 IS NULL THEN 'NULL'
        ELSE 'other'
    END AS result
FROM VALUES (1), (2), (NULL);

출력:

+---------+--------+
| COLUMN1 | RESULT |
|---------+--------|
|       1 | one    |
|       2 | two    |
|    NULL | NULL   |
+---------+--------+

다음 예는 CASE 와 데이터 정렬을 결합합니다.

SELECT CASE COLLATE('m', 'upper')
    WHEN 'M' THEN TRUE
    ELSE FALSE
END;
+----------------------------+
| CASE COLLATE('M', 'UPPER') |
|     WHEN 'M' THEN TRUE     |
|     ELSE FALSE             |
| END                        |
|----------------------------|
| True                       |
+----------------------------+
SELECT CASE 'm'
    WHEN COLLATE('M', 'lower') THEN TRUE
    ELSE FALSE
END;
+------------------------------------------+
| CASE 'M'                                 |
|     WHEN COLLATE('M', 'LOWER') THEN TRUE |
|     ELSE FALSE                           |
| END                                      |
|------------------------------------------|
| True                                     |
+------------------------------------------+
맨 위로 이동