개요
조건식 결과 직접 사용하기
0, 1 또는 NULL로 평가됩니다. 따라서 다음과 같이 조건식의 결과를 직접 사용할 수 있습니다.
조건식의 NULL 값
NULL 값이 포함되면 결과 역시 NULL이 됩니다.
Nullable이면 쿼리를 신중하게 작성해야 합니다.
다음 예시는 multiIf에 등호 조건을 추가하지 않았을 때 실패하는 모습을 보여줍니다.
CASE 문
CASE WHEN ... THEN ... ELSE ... END
이 형태는 매우 유연하며, 내부적으로 multiIf 함수를 사용해 구현됩니다. 각 조건은 서로 독립적으로 평가되며, 표현식에는 상수가 아닌 값도 포함할 수 있습니다.
CASE <expr> WHEN <val1> THEN ... WHEN <val2> THEN ... ELSE ... END
이 더 간결한 형식은 상수 값 매칭에 최적화되어 있으며, 내부적으로caseWithExpression()을 사용합니다.
주의 사항
multiIf와 같은 내부적으로 동등한 표현)의 결과 타입을 결정합니다. 이는 반환 표현식의 타입이 서로 다를 때, 예를 들어 시간대나 숫자 타입이 다를 때 중요합니다.
- 결과 타입은 모든 브랜치 중에서 가장 크게 호환되는 타입을 기준으로 선택됩니다.
- 이 타입이 한 번 선택되면, 다른 모든 브랜치는 암묵적으로 해당 타입으로 CAST됩니다. 해당 로직이 런타임에 실제로 실행되지 않더라도 마찬가지입니다.
- DateTime64처럼 시간대가 타입 시그니처의 일부인 타입에서는 예상치 못한 동작이 발생할 수 있습니다. 즉, 다른 브랜치에서 서로 다른 시간대를 지정하더라도 처음 발견된 시간대가 모든 브랜치에 사용될 수 있습니다.
Asia/Kolkata 기준의 타임스탬프를 반환합니다.
DateTime64(3, <timezone>) 반환 타입을 확인합니다. 처음 확인한 DateTime64(3, 'Asia/Kolkata'를 공통 타입으로 추론하고, 다른 브랜치는 이 타입으로 암묵적으로 변환합니다.
이 문제는 의도한 시간대 포맷을 유지할 수 있도록 문자열로 변환하여 해결할 수 있습니다:
clamp
value— 범위를 제한할 값입니다. -min— 최솟값입니다. -max— 최댓값입니다.
Query
Response
Query
Response
Query
Response
greatest
NULL 인수는 무시됩니다.
- 배열의 경우, 사전식으로 가장 큰 배열을 반환합니다.
DateTime타입의 경우, 결과 타입은 가장 큰 타입으로 승격됩니다(예:DateTime32와 섞여 있으면DateTime64).
NULL 동작을 변경하려면 setting least_greatest_legacy_null_behavior를 사용하세요버전 24.12에서는 하위 호환되지 않는 변경이 도입되어, 이제 NULL 값은 무시됩니다. 이전에는 인수 중 하나가 NULL이면 NULL을 반환했습니다.
이전 동작을 유지하려면 setting least_greatest_legacy_null_behavior(기본값: false)를 true로 설정하세요.x1[, x2, ...]— 비교할 하나 이상의 값입니다. 모든 인수는 서로 비교 가능한 타입이어야 합니다.Any
Any
예시
숫자 타입
Query
Response
Query
Response
Query
Response
if
- 조건
cond가 0이 아닌 값으로 평가되면 함수는then표현식의 결과를 반환합니다. cond가 0 또는 NULL로 평가되면else표현식의 결과를 반환합니다.
short_circuit_function_evaluation 설정은 단락 평가를 사용할지 여부를 제어합니다.
이 기능이 활성화되면 then 표현식은 cond가 true인 행에서만 평가되고, else 표현식은 cond가 false인 행에서만 평가됩니다.
예를 들어, 단락 평가를 사용하면 다음 쿼리를 실행할 때 0으로 나누기 예외가 발생하지 않습니다.
then과 else는 서로 비슷한 유형이어야 합니다.
구문
cond— 평가할 조건입니다.UInt8또는Nullable(UInt8)또는NULLthen—cond가 true인 경우 반환되는 표현식입니다. -else—cond가 false 또는NULL인 경우 반환되는 표현식입니다.
cond에 따라 then 또는 else 표현식의 결과를 반환합니다.
예시
사용 예시
Query
Response
least
NULL 인수는 무시됩니다.
- 배열의 경우 사전식 순서로 가장 작은 배열을 반환합니다.
- DateTime 타입의 경우 결과 타입은 가장 큰 타입으로 승격됩니다(예: DateTime32와 함께 사용되면 DateTime64).
NULL 동작을 변경하려면 설정 least_greatest_legacy_null_behavior를 사용하세요버전 24.12에서는 하위 호환되지 않는 변경이 도입되어, 이제 NULL 값은 무시됩니다. 이전에는 인수 중 하나가 NULL이면 NULL을 반환했습니다.
이전 동작을 유지하려면 설정 least_greatest_legacy_null_behavior(기본값: false)를 true로 설정하세요.x1[, x2, ...]— 비교할 단일 값 또는 여러 값입니다. 모든 인수는 서로 비교 가능한 타입이어야 합니다.Any
Any
예시
숫자형 타입
Query
Response
Query
Response
Query
Response
multiIf
CASE 연산자를 더 간결하게 작성할 수 있습니다.
각 조건을 순서대로 평가합니다. 처음으로 true(0이 아니고 NULL이 아닌 값)인 조건에 대해 해당 브랜치 값을 반환합니다.
어떤 조건도 true가 아니면 else 값을 반환합니다.
설정 short_circuit_function_evaluation은
단락 평가 사용 여부를 제어합니다. 이 설정이 활성화되면 then_i 표현식은
((NOT cond_1) AND ... AND (NOT cond_{i-1}) AND cond_i)가 true인 행에서만 평가됩니다.
예를 들어, 단락 평가를 사용하면 다음 쿼리를 실행할 때 0으로 나누기 예외가 발생하지 않습니다:
NULL 조건은 false로 간주됩니다.
구문
caseWithoutExpression, caseWithoutExpr
인수
cond_N—then_N을 반환할지 결정하는 N번째 평가 조건입니다.UInt8또는Nullable(UInt8)또는NULLthen_N—cond_N가 true일 때 함수가 반환하는 결과입니다. -else— 어떤 조건도 true가 아닐 때 함수가 반환하는 결과입니다.
cond_N에 대해서는 then_N의 결과를 반환하고, 그렇지 않으면 else 결과를 반환합니다.
예시
사용 예시
Query
Response