조건 표현식

조건 표현식 (Conditional expressions)

이 문서는 Trino의 조건부 표현식을 설명합니다. CASE, IF, COALESCE, NULLIF, TRY를 사용해 쿼리에서 조건에 따라 다른 값을 만들어내는 방법을 배울 수 있어요.

출처: 문서

본문

CASE

표준 SQL CASE 표현식에는 두 가지 형태가 있습니다. "단순(simple)" 형태는 각 value 표현식을 왼쪽에서 오른쪽으로 검색해 expression과 같은 것을 찾습니다:

CASE expression
    WHEN value THEN result
    [ WHEN ... ]
    [ ELSE result ]
END

일치하는 valueresult가 반환됩니다. 일치하는 것이 없으면 ELSE 절의 result가 있으면 반환하고, 없으면 null이 반환됩니다. 예제:

SELECT a,
       CASE a
           WHEN 1 THEN 'one'
           WHEN 2 THEN 'two'
           ELSE 'many'
       END

단순 형태의 WHEN 절은 값 외에도 조건 조각(predicate fragment)을 담을 수 있습니다. 조각의 왼쪽은 주위의 CASE expression이므로, WHEN > 100은 "expression > 100일 때"로 읽힙니다:

CASE expression
    WHEN > 100              THEN result
    WHEN BETWEEN 1 AND 10   THEN result
    WHEN IN (a, b, c)       THEN result
    WHEN IS NULL            THEN result
    WHEN LIKE 'a%'          THEN result
    WHEN IS DISTINCT FROM x THEN result
    [ WHEN value THEN result ]
    [ ELSE result ]
END

지원되는 조건 조각:

조각 읽는 법
op value 비교 연산자 op에 대해 expression op value
`op {ANY ALL
[NOT] BETWEEN low AND high expression [NOT] BETWEEN low AND high
[NOT] IN (value, ...) expression [NOT] IN (value, ...)
[NOT] IN (subquery) expression [NOT] IN (subquery)
[NOT] LIKE pattern [ESCAPE c] expression [NOT] LIKE pattern [ESCAPE c]
IS [NOT] NULL expression IS [NOT] NULL
IS [NOT] DISTINCT FROM value expression IS [NOT] DISTINCT FROM value

값 형태와 조건 조각 형태의 WHEN 절은 같은 CASE에서 섞을 수 있습니다. 절은 왼쪽에서 오른쪽으로 시도되고 첫 번째 일치가 이깁니다. 값 형태와 똑같습니다. 예제:

SELECT a,
       CASE a
           WHEN 0                THEN 'zero'
           WHEN > 100            THEN 'big'
           WHEN BETWEEN 1 AND 10 THEN 'small'
           WHEN IS NULL          THEN 'unknown'
           ELSE 'other'
       END

CASE 피연산자는 얼마나 많은 WHEN 절이 참조하든 행당 정확히 한 번 평가됩니다.

"검색(search)" 형태는 각 부울 condition을 왼쪽에서 오른쪽으로 평가해 하나가 true일 때 그에 해당하는 result를 반환합니다:

CASE
    WHEN condition THEN result
    [ WHEN ... ]
    [ ELSE result ]
END

어떤 조건도 true가 아니면 ELSE 절의 result가 있으면 반환하고, 없으면 null이 반환됩니다. 예제:

SELECT a, b,
       CASE
           WHEN a = 1 THEN 'aaa'
           WHEN b = 2 THEN 'bbb'
           ELSE 'ccc'
       END

SQL UDF는 CASE 표현식과 문법이 약간 다른 CASE 문을 사용할 수 있습니다. 구체적으로 각 절을 세미콜론 ;으로 끝내야 하고 END CASE를 사용해야 합니다.

IF

IF 표현식에는 true_value만 제공하는 형태와 true_valuefalse_value를 모두 제공하는 형태가 있습니다:

if(condition, true_value)

condition이 true이면 true_value를 평가해 반환하고, 그렇지 않으면 null을 반환하며 true_value는 평가되지 않습니다.

if(condition, true_value, false_value)

condition이 true이면 true_value를, 그렇지 않으면 false_value를 평가해 반환합니다.

다음 IFCASE 표현식은 동일합니다:

SELECT
  orderkey,
  totalprice,
  IF(totalprice >= 150000, 'High Value', 'Low Value')
FROM tpch.sf1.orders;
SELECT
  orderkey,
  totalprice,
  CASE
    WHEN totalprice >= 150000 THEN 'High Value'
    ELSE 'Low Value'
  END
FROM tpch.sf1.orders;

SQL UDF는 IF 표현식과 문법이 약간 다른 IF 문을 사용할 수 있습니다. 구체적으로 각 절을 세미콜론 ;으로 끝내야 하고 END IF를 사용해야 합니다.

COALESCE

coalesce(value1, value2[, ...])

인수 목록에서 첫 번째 null이 아닌 value를 반환합니다. CASE 표현식처럼 인수는 필요한 경우에만 평가됩니다.

NULLIF

nullif(value1, value2)

value1value2와 같으면 null을, 그렇지 않으면 value1을 반환합니다.

TRY

try(expression)

표현식을 평가하고 특정 유형의 오류를 NULL을 반환하며 처리합니다.

손상되거나 유효하지 않은 데이터를 만났을 때 쿼리가 실패하는 대신 NULL이나 기본값을 만들어내는 것이 선호되는 경우 TRY 함수가 유용할 수 있습니다. 기본값을 지정하려면 TRY 함수를 COALESCE 함수와 함께 사용할 수 있습니다.

TRY가 처리하는 오류:

  • 0으로 나누기 (Division by zero)
  • 잘못된 캐스트 또는 함수 인수 (Invalid cast or function argument)
  • 숫자 값 범위 초과 (Numeric value out of range)
  • 잘못된 JSON 리터럴 (Invalid JSON literal)
  • JSON 입력 또는 출력 변환 오류 (JSON input or output conversion errors)
  • JSON 경로 평가 오류 (JSON path evaluation errors)
  • JSON 값 함수 결과 오류 (JSON value function result errors)

예제 (Examples)

일부 잘못된 데이터가 있는 소스 테이블:

SELECT * FROM shipping;
 origin_state | origin_zip | packages | total_cost
--------------+------------+----------+------------
 California   |      94131 |       25 |        100
 California   |      P332a |        5 |         72
 California   |      94025 |        0 |        155
 New Jersey   |      08544 |      225 |        490
(4 rows)

TRY 없이 쿼리 실패:

SELECT CAST(origin_zip AS BIGINT) FROM shipping;
Query failed: Cannot cast 'P332a' to BIGINT

TRYNULL 값 처리:

SELECT TRY(CAST(origin_zip AS BIGINT)) FROM shipping;
 origin_zip
------------
      94131
 NULL
      94025
      08544
(4 rows)

TRY 없이 쿼리 실패:

SELECT total_cost / packages AS per_package FROM shipping;
Query failed: Division by zero

TRYCOALESCE로 기본값 처리:

SELECT COALESCE(TRY(total_cost / packages), 0) AS per_package FROM shipping;
 per_package
-------------
          4
         14
          0
         19
(4 rows)

더 알아보기 (Learn more)

조건부 표현식과 함께 쓰이는 논리 함수, 비교 함수도 살펴보세요. 값의 비교와 논리 결합 방식을 이해하면 조건부 쿼리를 더 풍부하게 만들 수 있어요.