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) 함수와 같습니다.

숫자 부호 반전 연산자

-anegate(a) 함수입니다.

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

곱셈 및 나눗셈 연산자

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

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

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

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

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

덧셈 및 뺄셈 연산자

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

튜플 덧셈: tuplePlus.

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

튜플 뺄셈: tupleMinus.

비교 연산자

equals 함수

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

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

notEquals 함수

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

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

lessOrEquals 함수

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

greaterOrEquals 함수

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

less 함수

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

greater 함수

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

like 함수

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

notLike 함수

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

ilike 함수

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

match 함수

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

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

notMatch 함수

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

matchCaseInsensitive 함수

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

notMatchCaseInsensitive 함수

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

BETWEEN 함수

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

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

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

<=> 연산자는 NULL-안전 동등 연산자이며, IS NOT DISTINCT FROM과 동일합니다. 이 연산자는 일반 동등 연산자(=)처럼 동작하지만, NULL 값도 비교할 수 있도록 처리합니다. 두 NULL 값은 같다고 간주되며, NULLNULL이 아닌 값과 비교하면 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 FROMIS 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:305를 반환하고 -3:30-3을 반환합니다.
  • TIMEZONE_MINUTE — 피연산자 시간대의 UTC 오프셋에서 부호 있는 분 부분입니다. 예를 들어, +5:3030을 반환하고 -3:30-30을 반환합니다.

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

date 매개변수는 처리할 값을 지정합니다. Date, Date32, DateTime, DateTime64, Interval 타입을 지원합니다. dateInterval인 경우, 요청한 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

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

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

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

INTERVAL 값을 지정할 때 문자열 리터럴을 사용할 수도 있습니다. 예를 들어 INTERVAL 1 HOURINTERVAL '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 ZONEAT LOCALDateTime 또는 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 ZONEtoTimeZone으로 변환되므로 동일한 시간대 인수 규칙이 적용됩니다. 따라서 컬럼 참조와 같은 비상수 표현식을 사용하려면 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 — 함수 andab의 논리곱을 계산합니다.

논리 OR 연산자

구문 SELECT a OR bor 함수를 사용해 ab의 논리합을 계산합니다.

논리 부정 연산자

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

조건 연산자

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

참고:

조건 연산자는 먼저 b와 c의 값을 계산한 다음, 조건 a가 참인지 확인하고 그에 해당하는 값을 반환합니다. b 또는 CarrayJoin() 함수인 경우, "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 || s2concat(s1, s2) 함수입니다.

람다 생성 연산자

x -> exprlambda(x, expr) 함수.

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

배열 생성 연산자

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

튜플 생성 연산자

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

결합 방향

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

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

NULL 검사하기

ClickHouse는 IS NULLIS 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 tableSELECT NOT n.null FROM TABLE로 변환됩니다.

불리언 값 확인

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

  • expr IS TRUEexprtrue인 경우에만 1을 반환합니다.
  • expr IS FALSEexprfalse인 경우에만 1을 반환합니다.
  • expr IS UNKNOWNexprNULL인 경우에만 1을 반환합니다.
  • expr IS NOT TRUEexprfalse 또는 NULL인 경우 1을 반환합니다.
  • expr IS NOT FALSEexprtrue 또는 NULL인 경우 1을 반환합니다.
  • expr IS NOT UNKNOWNexprNULL이 아닌 경우 1을 반환합니다.

불리언 표현식에서 IS UNKNOWNIS NULL과 동일하며, IS NOT UNKNOWNIS 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