접근 연산자
a[N] – 배열 요소에 접근합니다. arrayElement(a, N) 함수입니다.
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) 함수입니다.
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 연산자 (<=>)
25.10부터는
<=>를 다른 연산자와 마찬가지로 사용할 수 있습니다.
25.10 이전에는 JOIN 표현식에서만 사용할 수 있었으며, 예를 들면 다음과 같습니다:<=> 연산자는 NULL-안전 동등 연산자이며, IS NOT DISTINCT FROM과 동일합니다.
이 연산자는 일반 동등 연산자(=)처럼 동작하지만, NULL 값도 비교할 수 있도록 처리합니다.
두 NULL 값은 같다고 간주되며, NULL을 NULL이 아닌 값과 비교하면 NULL이 아니라 0(false)을 반환합니다.
문자열을 다루는 연산자
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 함수
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을 사용한 쿼리:
Query
Response
Query
Response
배열에 대한 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로 처리됩니다.
배열 형식은 비교 연산자 =, ==, !=, <>, <=>, <, <=, >, >=에서만 인식됩니다. 오른쪽에 배열을 받을 수 있는 다른 연산자(예: LIKE, ILIKE, NOT LIKE, REGEXP, IN)는 배열 한정자로 재작성되지 않으며 원래 의미를 유지합니다. 예를 들어 'abc' LIKE SOME(['a%', 'b%'])는 배열 한정자 구문이 아닙니다. 이런 경우에는 arrayExists / arrayAll를 직접 사용하십시오.
배열 형식에서는
ANY가 지원되지 않습니다오른쪽에 배열을 받을 수 있는 것은 SOME과 ALL뿐입니다. ANY는 any가 집계 함수이기도 하므로 제외됩니다. 따라서 expr = any(x) 형태의 표현식은 함수 호출이라는 의미를 유지합니다. 배열 한정자에는 SOME을 사용하십시오.Query
Response
NULL 처리는 서브쿼리 형식과 다릅니다배열 형식은 파서에서 재작성되므로(transform_null_in과 같은 쿼리 설정을 사용할 수 없고, 행별 배열 컬럼은 분석기의 null-safe IN 경로를 사용할 수 없음) has의 2값 의미론(= / <>의 경우)과 arrayExists / arrayAll을 사용합니다(NULL 비교의 미확정 결과는 0으로 접힘). 따라서 NULL 처리가 IN / NOT IN을 통해 수행되고 transform_null_in에 따라 달라지는 서브쿼리 형식과는 결과가 다를 수 있습니다:날짜 및 시간을 다루는 연산자
EXTRACT
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입니다.
예시:
DateTime 유형의 값을 삽입합니다.
INTERVAL
SECONDMINUTEHOURDAYWEEKMONTHQUARTERYEAR
INTERVAL 값을 지정할 때 문자열 리터럴을 사용할 수도 있습니다. 예를 들어 INTERVAL 1 HOUR는 INTERVAL '1 hour' 또는 INTERVAL '1' hour와 동일합니다.
예시:
INTERVAL 구문 또는 addDays 함수를 사용하는 것이 항상 권장됩니다. 단순한 덧셈이나 뺄셈(now() + ... 같은 구문)은 시간 설정을 반영하지 않습니다. 예를 들어 일광 절약 시간제는 고려되지 않습니다.- 인터벌 데이터 타입
- toInterval 변환 함수
날짜 및 시간 덧셈
+ 연산자를 사용해 Time 또는 Time64 값에 더할 수 있습니다. 결과는 해당 날짜의 지정된 시각을 나타내는 DateTime 또는 DateTime64입니다. 이 연산은 교환법칙이 성립합니다.
결과 유형은 피연산자 유형에 따라 달라집니다.
| 왼쪽 피연산자 | 오른쪽 피연산자 | 결과 유형 |
|---|---|---|
Date | Time | DateTime |
Date | Time64(s) | DateTime64(s) |
Date32 | Time | DateTime64(0) |
Date32 | Time64(s) | DateTime64(s) |
결과에는 세션 시간대(session timezone)가 사용됩니다(세션 시간대가 설정되지 않은 경우 서버 기본 시간대 사용).
date_time_overflow_behavior 설정은 결과가 표현 가능한 범위를 벗어날 때의 동작을 제어합니다.논리 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” 조건과 관계없이 각 행이 복제됩니다.
조건부 표현식
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 검사하기
IS NULL 및 IS NOT NULL 연산자를 지원합니다.
IS NULL
- 널 허용 타입 값에서
IS NULL연산자는 다음을 반환합니다.- 값이
NULL이면1 - 그렇지 않으면
0
- 값이
- 그 밖의 값에서는
IS NULL연산자가 항상0을 반환합니다.
optimize_functions_to_subcolumns = 1이면 함수는 전체 컬럼 데이터를 읽고 처리하는 대신 null 서브컬럼만 읽습니다. SELECT n IS NULL FROM table 쿼리는 SELECT n.null FROM TABLE로 변환됩니다.
IS NOT NULL
- 널 허용 타입의 값에 대해
IS NOT NULL연산자는 다음 값을 반환합니다.- 값이
NULL이면0 - 그렇지 않으면
1
- 값이
- 그 밖의 값에 대해서는
IS NOT NULL연산자가 항상1을 반환합니다.
optimize_functions_to_subcolumns = 1이면 함수는 전체 컬럼 데이터를 읽고 처리하는 대신 null 서브컬럼만 읽습니다. 쿼리 SELECT n IS NOT NULL FROM table는 SELECT NOT n.null FROM TABLE로 변환됩니다.
불리언 값 확인
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과 동일합니다.