case()

case() 함수는 조건-값 쌍을 순서대로 평가하여 처음으로 참이 되는 조건에 대응하는 값을 반환합니다. 어떤 조건도 참이 아닌 경우 선택적으로 지정한 기본값을 반환합니다.

문법

case(COND1, VAL1[, COND2, VAL2, ...[, DEFAULT]])

매개변수

COND1, COND2, ...
순서대로 평가할 조건 표현식입니다. null, 불리언 false, 숫자 0이나 NaN, 빈 문자열, 빈 목록·배열이나 맵은 거짓으로 판정하고, 그 외의 값은 참으로 판정합니다. 최소 1개의 조건-값(COND, VAL) 쌍을 지정해야 합니다.
VAL1, VAL2, ...
각 조건이 참으로 판정될 때 반환할 값 표현식입니다. 대응하는 조건과 쌍을 이룹니다.
DEFAULT
(선택) 모든 조건이 거짓으로 판정될 때 반환할 기본값입니다. 인수의 총 개수가 홀수인 경우 마지막 인수가 기본값으로 사용됩니다.

설명

case() 함수는 COND1, COND2, ... 순으로 조건을 평가하여 참·거짓을 판정합니다. 조건이 참으로 판정되면 해당 조건에 대응하는 값을 즉시 반환합니다. 이후 조건은 평가하지 않습니다.

어떤 조건도 참이 되지 않은 경우, 기본값(DEFAULT)이 지정되어 있으면 기본값을 반환하고, 기본값이 없으면 null을 반환합니다.

조건이 거짓으로 판정되면 다음 조건으로 넘어갑니다.

반환 타입은 실제로 평가된 값 표현식의 타입에 따라 결정됩니다. 값 표현식들의 타입이 서로 다르면 자동으로 상위 타입으로 승격됩니다(예: 정수와 실수가 혼합되면 실수로 반환).

오류 코드

오류 코드설명
99000조건-값 쌍을 하나도 지정하지 않고 호출한 경우(예: case() 단독 호출, 기본값만 지정한 호출)

사용 예

이 사용 예에서 조회하는 WEB_APACHE_SAMPLE 테이블을 준비하려면 쿼리 실습용 데이터를 참고하세요.

  1. HTTP 상태 코드 범위에 따른 레이블 분류

    table limit=5 WEB_APACHE_SAMPLE
    | eval label = case(status >= 500, "서버 오류", status >= 400, "클라이언트 오류", status >= 300, "리다이렉트", "정상")
    | fields status, label
    | # status 값에 따라 label이 결정됩니다.
    
  2. HTTP 메서드에 따른 분류

    table limit=5 WEB_APACHE_SAMPLE
    | eval type = case(method == "GET", "조회", method == "POST", "제출", method == "OPTIONS", "사전 확인", "기타")
    | fields method, type
    
  3. 어떤 조건도 참이 아니고 기본값도 없는 경우

    json "{'val': 0}" | eval result = case(val == 1, "일", val == 2, "이")
    | # result: null
    
  4. NULL 입력 — 조건 평가 시 null은 거짓으로 처리되어 기본값 반환

    json "{'val': null}" | eval result = case(val == 1, "일", "기본값")
    | # result: 기본값
    
  5. 숫자 0을 조건으로 사용 — 거짓으로 판정(4.0.2609.0부터 적용된 동작)

    json "{'val': 0}" | eval result = case(val, "참", "거짓")
    | # result: 거짓
    

    4.0.2609.0 이전에는 조건이 불리언이 아니면서 null도 아닌 값이면 항상 참으로 판정되어 이 예의 결과가 "참"이었습니다. 이제는 숫자 0이 거짓으로 판정되어 기본값("거짓")이 반환됩니다.

  6. 조건-값 쌍 없이 호출 — 파싱 오류(4.0.2609.0부터 적용된 동작)

    json "{}" | eval result = case()
    

    조건-값 쌍을 하나도 지정하지 않아 쿼리 실행 전에 파싱 오류(오류 코드 99000)가 발생합니다. 4.0.2609.0 이전에는 이런 호출도 파싱은 통과했습니다. 이후 실행 단계에서는 경로에 따라 결과가 달랐습니다 — 벡터화 실행 경로에서는 오류(NullPointerException)로 쿼리가 실패했고, 행 단위 실행 경로에서는 오류 없이 null을 반환했습니다.

변경 이력

대상도입 릴리스
case() 함수소나 4.0 이전 버전
조건 판정 기준 통일 — 숫자 0·빈 문자열 등을 거짓으로 판정4.0.2609.0
조건-값 쌍 미달 시 파싱 오류(99000)4.0.2609.0