Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

연산자

ClickHouse는 쿼리 파싱 단계에서 연산자의 우선순위, precedence, 결합 방향에 따라 해당하는 함수로 변환합니다.

접근 연산자

a[N] – 배열 원소에 접근합니다. arrayElement(a, N) 함수와 같습니다. N은 정수 배열일 수도 있으며, 이 경우 arrayMap(i -> a[i], N)과 마찬가지로 해당 위치의 모든 원소가 배열로 반환됩니다. 위치는 널 허용일 수 있습니다. 원소 타입을 Nullable로 감쌀 수 있는 경우 NULL 위치는 NULL을 반환합니다. Nullable 내부에 포함될 수 없는 원소 타입(Array, Map 등)의 경우에는 스칼라 NULL 인덱스와 마찬가지로 원소 타입의 기본값을 반환합니다.

a.N – 튜플 원소에 접근합니다. tupleElement(a, N) 함수와 같습니다.

숫자 부호 반전 연산자

-a – negate(a) 함수입니다.

튜플 부호 반전은 다음을 참조하십시오: tupleNegate.

곱셈 및 나눗셈 연산자

a * b – multiply(a, b) 함수입니다.

튜플에 숫자를 곱하려면 tupleMultiplyByNumber, 스칼라 곱에는 dotProduct를 사용합니다.

a / b – divide(a, b) 함수입니다.

튜플을 숫자로 나누려면 tupleDivideByNumber를 사용합니다.

a % b – modulo(a, b) 함수입니다。

덧셈 및 뺄셈 연산자

a + b – plus(a, b) 함수입니다.

튜플 덧셈: tuplePlus.

a - b – minus(a, b) 함수입니다.

튜플 뺄셈: tupleMinus.

비교 연산자

equals 함수

a = b – equals(a, b) 함수입니다.

a == b – equals(a, b) 함수입니다.

notEquals 함수

a != b – notEquals(a, b) 함수입니다.

a <> b – notEquals(a, b) 함수입니다.

lessOrEquals 함수

a <= b - lessOrEquals(a, b) 함수입니다.

greaterOrEquals 함수

a >= b – greaterOrEquals(a, b) 함수입니다.

less 함수

a < b – less(a, b) 함수입니다.

greater 함수

a > b – greater(a, b) 함수입니다.

like 함수

a LIKE b – like(a, b) 함수입니다.

notLike 함수

a NOT LIKE b – notLike(a, b) 함수입니다.

ilike 함수

a ILIKE b – ilike(a, b) 함수입니다.

match 함수

a REGEXP b – match(a, b) 함수입니다.

a ~ b – match(a, b) 함수입니다(PostgreSQL 스타일의 정규식 일치).

notMatch 함수

a !~ b – notMatch(a, b) 함수(a가 정규식 b와 일치하지 않는지 확인합니다).

matchCaseInsensitive 함수

a ~* b – matchCaseInsensitive(a, b) 함수(대소문자를 구분하지 않는 정규식 일치)입니다.

notMatchCaseInsensitive 함수

a !~* b – notMatchCaseInsensitive(a, b) 함수(a가 정규식 b와 대소문자를 구분하지 않고 일치하지 않는지 확인합니다).

BETWEEN 함수

a BETWEEN b AND c – a >= b AND a <= c와 동일합니다.

a NOT BETWEEN b AND c – a < b OR a > c와 동일합니다.

is not distinct from 연산자 (<=>)

<=> 연산자는 NULL-안전 동등 연산자이며, IS NOT DISTINCT FROM과 동일합니다. 이 연산자는 일반 동등 연산자(=)처럼 동작하지만, NULL 값도 비교할 수 있도록 처리합니다. 두 NULL 값은 같다고 간주되며, NULL을 NULL이 아닌 값과 비교하면 NULL이 아니라 0(false)을 반환합니다.

SELECT
  'ClickHouse' <=> NULL,
  NULL <=> NULL
┌─isNotDistinc⋯use', NULL)─┬─isNotDistinc⋯NULL, NULL)─┐
│                        0 │                        1 │
└──────────────────────────┴──────────────────────────┘

문자열을 다루는 연산자

OVERLAY

  • OVERLAY(string PLACING replacement FROM offset) - overlay(string, replacement, offset) 함수입니다.
  • OVERLAY(string PLACING replacement FROM offset FOR length) - overlay(string, replacement, offset, length) 함수입니다.
  • OVERLAYUTF8(string PLACING replacement FROM offset) - overlayUTF8(string, replacement, offset) 함수입니다.
  • OVERLAYUTF8(string PLACING replacement FROM offset FOR length) - overlayUTF8(string, replacement, offset, length) 함수입니다.

데이터 세트 작업을 위한 연산자

IN 연산자 및 EXISTS 연산자를 참조하십시오.

in 함수

a IN ... – in(a, b) 함수입니다.

notIn 함수

a NOT IN ...에 해당하는 notIn(a, b) 함수입니다.

globalIn 함수

a GLOBAL IN ... – globalIn(a, b) 함수입니다.

globalNotIn 함수

a GLOBAL NOT IN ... – globalNotIn(a, b) 함수입니다.

in 서브쿼리 함수

a = ANY (subquery) – in(a, subquery) 함수와 같습니다.

notIn 서브쿼리 함수

a != ANY (subquery) – a NOT IN (SELECT singleValueOrNull(*) FROM subquery)와 동일합니다.

in subquery 함수

a = ALL (subquery) – a IN (SELECT singleValueOrNull(*) FROM subquery)와 같습니다.

notIn 서브쿼리 함수

a != ALL (subquery) – notIn(a, subquery) 함수입니다.

예시

ALL을 사용한 쿼리:

Querysql
SELECT number AS a FROM numbers(10) WHERE a > ALL (SELECT number FROM numbers(3, 3));
Responsetext
┌─a─┐
│ 6 │
│ 7 │
│ 8 │
│ 9 │
└───┘

ANY를 사용한 쿼리:

Querysql
SELECT number AS a FROM numbers(10) WHERE a > ANY (SELECT number FROM numbers(3, 3));
Responsetext
┌─a─┐
│ 4 │
│ 5 │
│ 6 │
│ 7 │
│ 8 │
│ 9 │
└───┘

배열에 대한 SOME / ALL

위에서 설명한 서브쿼리 형식 외에도 SOME / ALL의 오른쪽에는 배열 표현식(배열 리터럴, 배열 타입의 컬럼, 또는 배열을 반환하는 임의의 표현식)이 올 수 있습니다. 이는 PostgreSQL 스타일의 배열 한정자 구문입니다. 이 구문은 구문 분석 시점에 인식되어 배열 함수로 재작성되므로 수동으로 재작성할 필요가 없습니다:

구문 재작성 결과
expr = SOME(arr) has(arr, expr)
expr <> ALL(arr) NOT has(arr, expr)
expr OP SOME(arr) (지원되는 그 밖의 모든 연산자) arrayExists(x -> expr OP x, arr)
expr OP ALL(arr) (지원되는 그 밖의 모든 연산자) arrayAll(x -> expr OP x, arr)

SOME은 존재 한정자입니다(ANY의 SQL 동의어). = 및 <>는 최적화된 구현이 있으므로 예외적으로 has / NOT has로 재작성됩니다. 일반 형식은 고차 함수인 arrayExists / arrayAll로 처리됩니다.

배열 형식은 비교 연산자 =, ==, !=, <>, <=>, <, <=, >, >=, 키워드 비교 프레디케이트 IS DISTINCT FROM 및 IS NOT DISTINCT FROM, 그리고 문자열 검색 프레디케이트 LIKE, ILIKE, NOT LIKE, NOT ILIKE, REGEXP에서 인식됩니다. 키워드 비교 프레디케이트와 문자열 검색 프레디케이트는 서브쿼리 형식이 아니라 배열 형식에서만 인식됩니다(서브쿼리 형식은 IN/NOT IN으로 변환됩니다). 배열 한정자 의미가 없는 연산자(예: IN 자체)는 재작성되지 않으며 원래 의미를 유지합니다.

문자열 검색 프레디케이트가 작동하는 이유는 MatchImpl(LIKE / ILIKE / REGEXP의 기반 구현)이 비상수 needle과 함께 상수 haystack을 지원하기 때문입니다. 예를 들어 'abc' LIKE SOME(['a%', 'b%'])는 arrayExists(x -> 'abc' LIKE x, ['a%', 'b%'])로 재작성되고, 'abc' NOT LIKE ALL(['x%', 'y%'])는 arrayAll(x -> 'abc' NOT LIKE x, ['x%', 'y%'])로 재작성됩니다. 이는 하나의 문자열을 여러 패턴과 매칭합니다. 단일 결합 패스로 매칭하려면 multiMatchAny(정규식) 또는 multiSearchAny(substrings)와 같은 다중 패턴 검색 함수를 계속 사용할 수 있습니다.

Querysql
SELECT
    3 = SOME([1, 2, 3, 4])         AS in_array,
    5 < SOME([1, 2, 6])            AS less_than_some,
    5 > ALL([1, 2, 3])             AS greater_than_all,
    'abc' LIKE SOME(['a%', 'z%'])  AS like_some;
Responsetext
┌─in_array─┬─less_than_some─┬─greater_than_all─┬─like_some─┐
│        1 │              1 │                1 │         1 │
└──────────┴────────────────┴──────────────────┴───────────┘

날짜 및 시간을 다루는 연산자

EXTRACT

EXTRACT(part FROM date);

주어진 날짜에서 특정 부분을 추출합니다. 예를 들어, 날짜에서 월을 가져오거나 시간에서 초를 가져올 수 있습니다.

part 매개변수는 날짜에서 추출할 부분을 지정합니다. 사용할 수 있는 값은 다음과 같습니다.

  • NANOSECOND — 나노초입니다. 가능한 값: 0–999999999.
  • MICROSECOND — 마이크로초입니다. 가능한 값: 0–999999.
  • MILLISECOND — 밀리초입니다. 가능한 값: 0–999.
  • SECOND — 초입니다. 가능한 값: 0–59.
  • MINUTE — 분입니다. 가능한 값: 0–59.
  • HOUR — 시입니다. 가능한 값: 0–23.
  • DAY — 일입니다. 가능한 값: 1–31.
  • WEEK — ISO 8601 주 번호입니다. 가능한 값: 1–53.
  • MONTH — 월 번호입니다. 가능한 값: 1–12.
  • QUARTER — 분기입니다. 가능한 값: 1–4.
  • YEAR — 연도입니다.
  • EPOCH — Unix timestamp(1970-01-01 00:00:00 UTC 이후의 초)입니다. 참고: DateTime64의 경우 소수점 이하 초 부분은 잘립니다.
  • DOW — 요일(PostgreSQL 호환)입니다. 0 = 일요일, 6 = 토요일입니다.
  • DOY — 연중 날짜입니다. 가능한 값: 1–366.
  • ISODOW — ISO 요일입니다. 1 = 월요일, 7 = 일요일입니다.
  • ISOYEAR — ISO 8601 주 번호 기준 연도입니다.
  • CENTURY — 세기입니다. 예를 들어, 2024년은 21세기에 속합니다.
  • DECADE — 10년 단위입니다(연도를 10으로 나눈 값). 예를 들어, 2024년의 decade는 202입니다.
  • MILLENNIUM — 천년 단위입니다. 예를 들어, 2024년은 세 번째 millennium에 속합니다.
  • TIMEZONE_HOUR — 피연산자 시간대의 UTC 오프셋에서 부호 있는 시 부분입니다. 예를 들어, +5:30은 5를 반환하고 -3:30은 -3을 반환합니다.
  • TIMEZONE_MINUTE — 피연산자 시간대의 UTC 오프셋에서 부호 있는 분 부분입니다. 예를 들어, +5:30은 30을 반환하고 -3:30은 -30을 반환합니다.

part 매개변수는 대소문자를 구분하지 않습니다.

date 매개변수는 처리할 값을 지정합니다. Date, Date32, DateTime, DateTime64, Interval 타입을 지원합니다. date가 Interval인 경우, 요청한 part는 인터벌에 저장된 종류와 일치해야 합니다(예: EXTRACT(DAY FROM INTERVAL 5 DAY)는 허용되지만 EXTRACT(HOUR FROM INTERVAL 5 DAY)는 거부됩니다. ClickHouse 인터벌은 단일 종류만 저장하기 때문입니다). Interval 피연산자에 대한 결과는 Int64입니다.

예시:

SELECT EXTRACT(DAY FROM toDate('2017-06-15'));
SELECT EXTRACT(MONTH FROM toDate('2017-06-15'));
SELECT EXTRACT(YEAR FROM toDate('2017-06-15'));
SELECT EXTRACT(EPOCH FROM toDateTime('2024-01-15 12:30:45', 'UTC'));
SELECT EXTRACT(DOW FROM toDate('2024-01-15'));
SELECT EXTRACT(CENTURY FROM toDate('2024-01-01'));
SELECT EXTRACT(TIMEZONE_HOUR   FROM toDateTime('2024-01-15 12:00:00', 'Asia/Kolkata'));    -- 5
SELECT EXTRACT(TIMEZONE_MINUTE FROM toDateTime('2024-01-15 12:00:00', 'Asia/Kolkata'));    -- 30
SELECT EXTRACT(DAY   FROM INTERVAL 40 DAY);                                                -- 40
SELECT EXTRACT(MONTH FROM INTERVAL 7 MONTH);                                               -- 7

다음 예시에서는 테이블을 생성한 다음 DateTime 유형의 값을 삽입합니다.

CREATE TABLE test.Orders
(
    OrderId UInt64,
    OrderName String,
    OrderDate DateTime
) ENGINE = MergeTree
ORDER BY ();
INSERT INTO test.Orders VALUES (1, 'Jarlsberg Cheese', toDateTime('2008-10-11 13:23:44'));
SELECT
    toYear(OrderDate) AS OrderYear,
    toMonth(OrderDate) AS OrderMonth,
    toDayOfMonth(OrderDate) AS OrderDay,
    toHour(OrderDate) AS OrderHour,
    toMinute(OrderDate) AS OrderMinute,
    toSecond(OrderDate) AS OrderSecond
FROM test.Orders;
┌─OrderYear─┬─OrderMonth─┬─OrderDay─┬─OrderHour─┬─OrderMinute─┬─OrderSecond─┐
│      2008 │         10 │       11 │        13 │          23 │          44 │
└───────────┴────────────┴──────────┴───────────┴─────────────┴─────────────┘

tests에서 더 많은 예시를 확인할 수 있습니다.

INTERVAL

Date 및 DateTime 타입 값과의 산술 연산에 사용되는 인터벌 타입 값을 생성합니다.

인터벌 타입은 다음과 같습니다.

  • SECOND
  • MINUTE
  • HOUR
  • DAY
  • WEEK
  • MONTH
  • QUARTER
  • YEAR

INTERVAL 값을 지정할 때 문자열 리터럴을 사용할 수도 있습니다. 예를 들어 INTERVAL 1 HOUR는 INTERVAL '1 hour' 또는 INTERVAL '1' hour와 동일합니다.

예시:

SELECT now() AS current_date_time, current_date_time + INTERVAL 4 DAY + INTERVAL 3 HOUR;
┌───current_date_time─┬─plus(plus(now(), toIntervalDay(4)), toIntervalHour(3))─┐
│ 2020-11-03 22:09:50 │                                    2020-11-08 01:09:50 │
└─────────────────────┴────────────────────────────────────────────────────────┘
SELECT now() AS current_date_time, current_date_time + INTERVAL '4 day' + INTERVAL '3 hour';
┌───current_date_time─┬─plus(plus(now(), toIntervalDay(4)), toIntervalHour(3))─┐
│ 2020-11-03 22:12:10 │                                    2020-11-08 01:12:10 │
└─────────────────────┴────────────────────────────────────────────────────────┘
SELECT now() AS current_date_time, current_date_time + INTERVAL '4' day + INTERVAL '3' hour;
┌───current_date_time─┬─plus(plus(now(), toIntervalDay('4')), toIntervalHour('3'))─┐
│ 2020-11-03 22:33:19 │                                        2020-11-08 01:33:19 │
└─────────────────────┴────────────────────────────────────────────────────────────┘

예시:

SELECT toDateTime('2014-10-26 00:00:00', 'Asia/Istanbul') AS time, time + 60 * 60 * 24 AS time_plus_24_hours, time + toIntervalDay(1) AS time_plus_1_day;
┌────────────────time─┬──time_plus_24_hours─┬─────time_plus_1_day─┐
│ 2014-10-26 00:00:00 │ 2014-10-26 23:00:00 │ 2014-10-27 00:00:00 │
└─────────────────────┴─────────────────────┴─────────────────────┘

관련 항목

날짜 및 시간 덧셈

Date 또는 Date32 값은 + 연산자를 사용해 Time 또는 Time64 값에 더할 수 있습니다. 결과는 해당 날짜의 지정된 시각을 나타내는 DateTime 또는 DateTime64입니다. 이 연산은 교환법칙이 성립합니다.

결과 유형은 피연산자 유형에 따라 달라집니다.

왼쪽 피연산자 오른쪽 피연산자 결과 유형
Date Time DateTime
Date Time64(s) DateTime64(s)
Date32 Time DateTime64(0)
Date32 Time64(s) DateTime64(s)

예시:

SET use_legacy_to_time = 0;
SELECT toDate('2024-07-15') + toTime('14:30:25') AS dt, toTypeName(dt);
┌──────────────────dt─┬─toTypeName(dt)─┐
│ 2024-07-15 14:30:25 │ DateTime       │
└─────────────────────┴────────────────┘
SELECT toDate('2024-07-15') + toTime64('14:30:25.123456', 6) AS dt, toTypeName(dt);
┌─────────────────────────dt─┬─toTypeName(dt)─┐
│ 2024-07-15 14:30:25.123456 │ DateTime64(6)  │
└────────────────────────────┴────────────────┘
SELECT toTime64('23:59:59.999', 3) + toDate32('2024-07-15') AS dt, toTypeName(dt);
┌──────────────────────dt─┬─toTypeName(dt)─┐
│ 2024-07-15 23:59:59.999 │ DateTime64(3)  │
└─────────────────────────┴────────────────┘

AT TIME ZONE 및 AT LOCAL

후위 연산자 AT TIME ZONE 및 AT LOCAL은 DateTime 또는 DateTime64 값을 다른 시간대로 변환합니다. 이는 기존 toTimeZone 함수의 축약 문법입니다:

구문 동일한 표현
expr AT TIME ZONE zone toTimeZone(expr, zone)
expr AT LOCAL toTimeZone(expr, timeZone())

zone은 유효한 시간대 이름으로 평가되는 임의의 상수 문자열 표현식일 수 있습니다(예: 'America/Denver', 'UTC', 또는 concat('America', '/', 'Denver')). AT TIME ZONE은 toTimeZone으로 변환되므로 동일한 시간대 인수 규칙이 적용됩니다. 따라서 컬럼 참조와 같은 비상수 표현식을 사용하려면 allow_nonconst_timezone_arguments = 1이 필요합니다.

AT LOCAL은 현재 세션 시간대을 사용합니다(세션 시간대가 설정되지 않은 경우 서버 기본값 사용). Distributed 테이블에서는 session_timezone을 명시적으로 설정해야 합니다. 비어 있으면 timeZone()은 세그먼트 로컬이므로 상수 toTimeZone 인수로 사용할 수 없어 ILLEGAL_COLUMN 예외가 발생합니다.

AT TIME ZONE의 연산자 precedence는 13입니다(*///%의 12보다 높고 +/-의 11보다 높음). 이는 PostgreSQL과 일치합니다. 즉, a * ts AT TIME ZONE 'tz'는 a * (ts AT TIME ZONE 'tz')로 묶이고, ts + interval AT TIME ZONE 'tz'는 ts + (interval AT TIME ZONE 'tz')로 묶입니다. 산술 연산 후에 시간대 변환을 적용하려면 명시적으로 괄호를 사용하십시오:

-- Explicit parens required to add first, then convert timezone
SELECT (TIMESTAMP '2001-02-16 20:38:40' + INTERVAL 1 HOUR) AT TIME ZONE 'America/Denver';
-- Equivalent to:
SELECT toTimeZone(TIMESTAMP '2001-02-16 20:38:40' + INTERVAL 1 HOUR, 'America/Denver');

예시:

SET session_timezone = 'UTC';

SELECT TIMESTAMP '2001-02-16 20:38:40' AT TIME ZONE 'America/Denver';
┌─toTimeZone(toDateTime('2001-02-16 20:38:40'), 'America/Denver')─┐
│ 2001-02-16 13:38:40                                              │
└──────────────────────────────────────────────────────────────────┘
SELECT TIMESTAMP '2001-02-16 20:38:40' AT LOCAL;
┌─toTimeZone(toDateTime('2001-02-16 20:38:40'), timeZone())─┐
│ 2001-02-16 20:38:40                                        │
└────────────────────────────────────────────────────────────┘

관련 항목

논리 AND 연산자

구문 SELECT a AND b — 함수 and로 a와 b의 논리곱을 계산합니다.

논리 OR 연산자

구문 SELECT a OR b — or 함수를 사용해 a와 b의 논리합을 계산합니다.

논리 부정 연산자

구문 SELECT NOT a — 함수 not를 사용해 a의 논리 부정을 계산합니다.

조건 연산자

a ? b : c – if(a, b, c) 함수입니다.

참고:

조건 연산자는 먼저 b와 c의 값을 계산한 다음, 조건 a가 참인지 확인하고 그에 해당하는 값을 반환합니다. b 또는 C가 arrayJoin() 함수인 경우, "a" 조건과 관계없이 각 행이 복제됩니다.

조건부 표현식

CASE [x]
    WHEN a THEN b
    [WHEN ... THEN ...]
    [ELSE c]
END

x가 지정되면 transform(x, [a, ...], [b, ...], c) 함수를 사용합니다. 그렇지 않으면 multiIf(a, b, ..., c)를 사용합니다.

표현식에 ELSE c 절이 없으면 기본값은 NULL입니다.

transform 함수는 NULL에서는 작동하지 않습니다.

연결 연산자

s1 || s2 – concat(s1, s2) 함수입니다.

람다 생성 연산자

x -> expr – lambda(x, expr) 함수.

다음 연산자는 괄호이므로 우선순위가 없습니다:

배열 생성 연산자

[x1, ...] – array(x1, ...) 함수.

튜플 생성 연산자

(x1, x2, ...) – tuple(x2, x2, ...) 함수입니다.

결합 방향

모든 이항 연산자는 좌결합입니다. 예를 들어 1 + 2 + 3은 plus(plus(1, 2), 3)으로 변환됩니다. 하지만 때로는 이것이 예상대로 동작하지 않을 수 있습니다. 예를 들어 SELECT 4 > 2 > 3의 결과는 0입니다.

효율성을 위해 and 및 or 함수는 인수를 개수 제한 없이 받을 수 있습니다. 이에 해당하는 AND 및 OR 연산자 체인은 이 함수를 한 번 호출하는 형태로 변환됩니다.

NULL 검사하기

ClickHouse는 IS NULL 및 IS NOT NULL 연산자를 지원합니다.

IS NULL

  • 널 허용 타입 값에서 IS NULL 연산자는 다음을 반환합니다.
    • 값이 NULL이면 1
    • 그렇지 않으면 0
  • 그 밖의 값에서는 IS NULL 연산자가 항상 0을 반환합니다.

optimize_functions_to_subcolumns 설정을 활성화하면 이 동작을 최적화할 수 있습니다. optimize_functions_to_subcolumns = 1이면 함수는 전체 컬럼 데이터를 읽고 처리하는 대신 null 서브컬럼만 읽습니다. SELECT n IS NULL FROM table 쿼리는 SELECT n.null FROM TABLE로 변환됩니다.

SELECT x+100 FROM t_null WHERE y IS NULL
┌─plus(x, 100)─┐
│          101 │
└──────────────┘

IS NOT NULL

  • 널 허용 타입의 값에 대해 IS NOT NULL 연산자는 다음 값을 반환합니다.
    • 값이 NULL이면 0
    • 그렇지 않으면 1
  • 그 밖의 값에 대해서는 IS NOT NULL 연산자가 항상 1을 반환합니다.
SELECT * FROM t_null WHERE y IS NOT NULL
┌─x─┬─y─┐
│ 2 │ 3 │
└───┴───┘

optimize_functions_to_subcolumns 설정을 활성화하면 이를 최적화할 수 있습니다. optimize_functions_to_subcolumns = 1이면 함수는 전체 컬럼 데이터를 읽고 처리하는 대신 null 서브컬럼만 읽습니다. 쿼리 SELECT n IS NOT NULL FROM table는 SELECT NOT n.null FROM TABLE로 변환됩니다.

불리언 값 확인

ClickHouse는 IS TRUE, IS FALSE, IS UNKNOWN, IS NOT TRUE, IS NOT FALSE, IS NOT UNKNOWN 연산자를 지원합니다. 이 연산자들은 Bool 및 Nullable(Bool) 표현식과 함께 사용됩니다.

  • expr IS TRUE는 expr가 true인 경우에만 1을 반환합니다.
  • expr IS FALSE는 expr가 false인 경우에만 1을 반환합니다.
  • expr IS UNKNOWN는 expr가 NULL인 경우에만 1을 반환합니다.
  • expr IS NOT TRUE는 expr가 false 또는 NULL인 경우 1을 반환합니다.
  • expr IS NOT FALSE는 expr가 true 또는 NULL인 경우 1을 반환합니다.
  • expr IS NOT UNKNOWN는 expr가 NULL이 아닌 경우 1을 반환합니다.

불리언 표현식에서 IS UNKNOWN은 IS NULL과 동일하며, IS NOT UNKNOWN은 IS NOT NULL과 동일합니다.

CREATE TABLE t_bool (x Nullable(Bool)) ENGINE = Memory;
INSERT INTO t_bool VALUES (true), (false), (NULL);

SELECT
    x,
    x IS TRUE,
    x IS FALSE,
    x IS UNKNOWN,
    x IS NOT TRUE,
    x IS NOT FALSE,
    x IS NOT UNKNOWN
FROM t_bool;
Navigation