각 요소가 각각의 개별 타입을 갖는 튜플입니다. 튜플에는 최소 1개의 요소가 있어야 합니다.
튜플은 컬럼을 일시적으로 그룹화하는 데 사용됩니다. 쿼리에서 IN 표현식을 사용할 때 컬럼을 그룹화할 수 있으며, 람다 함수의 특정 형식 매개변수를 지정할 때도 사용됩니다. 자세한 내용은 IN operators 및 Higher order functions 섹션을 참조하십시오.
튜플은 쿼리 결과로 반환될 수 있습니다. 이 경우 JSON을 제외한 형식에서는 값이 () 안에 쉼표로 구분되어 표시됩니다. JSON formats에서는 튜플이 배열([])로 출력됩니다.
함수를 사용해 튜플을 생성할 수 있습니다:
튜플 생성 예시:
SELECT tuple(1, 'a') AS x, toTypeName(x)
┌─x───────┬─toTypeName(tuple(1, 'a'))─┐
│ (1,'a') │ Tuple(UInt8, String) │
└─────────┴───────────────────────────┘
튜플에는 요소가 하나만 있을 수 있습니다
예시:
┌─x─────┐
│ ('a') │
└───────┘
(tuple_element1, tuple_element2) 구문을 사용하면 tuple() 함수를 호출하지 않고도 여러 요소로 구성된 튜플을 만들 수 있습니다.
예시:
SELECT (1, 'a') AS x, (today(), rand(), 'someString') AS y, ('a') AS not_a_tuple;
┌─x───────┬─y──────────────────────────────────────┬─not_a_tuple─┐
│ (1,'a') │ ('2022-09-21',2006973416,'someString') │ a │
└─────────┴────────────────────────────────────────┴─────────────┘
튜플을 즉석에서 생성하면 ClickHouse는 주어진 인수 값을 담을 수 있는 가장 작은 타입으로 튜플 인수의 타입을 추론합니다. 값이 NULL이면 추론되는 타입은 널 허용입니다.
자동 데이터 타입 감지 예시:
SELECT tuple(1, NULL) AS x, toTypeName(x)
┌─x─────────┬─toTypeName(tuple(1, NULL))──────┐
│ (1, NULL) │ Tuple(UInt8, Nullable(Nothing)) │
└───────────┴─────────────────────────────────┘
튜플 요소는 이름 또는 인덱스로 참조할 수 있습니다:
CREATE TABLE named_tuples (`a` Tuple(s String, i Int64)) ENGINE = Memory;
INSERT INTO named_tuples VALUES (('y', 10)), (('x',-10));
SELECT a.s FROM named_tuples; -- 이름으로 참조
SELECT a.2 FROM named_tuples; -- 인덱스로 참조
┌─a.s─┐
│ y │
│ x │
└─────┘
┌─tupleElement(a, 2)─┐
│ 10 │
│ -10 │
└────────────────────┘
두 튜플은 왼쪽에서 오른쪽 순서로 각 요소를 차례대로 비교합니다. 첫 번째 튜플의 요소가 두 번째 튜플의 대응하는 요소보다 크면(작으면), 첫 번째 튜플이 두 번째 튜플보다 큰 것(작은 것)으로 판단합니다. 그렇지 않으면(두 요소가 모두 같으면) 다음 요소를 비교합니다.
예시:
SELECT (1, 'z') > (1, 'a') c1, (2022, 01, 02) > (2023, 04, 02) c2, (1,2,3) = (3,2,1) c3;
┌─c1─┬─c2─┬─c3─┐
│ 1 │ 0 │ 0 │
└────┴────┴────┘
실제 사용 예시:
CREATE TABLE test
(
`year` Int16,
`month` Int8,
`day` Int8
)
ENGINE = Memory AS
SELECT *
FROM values((2022, 12, 31), (2000, 1, 1));
SELECT * FROM test;
┌─year─┬─month─┬─day─┐
│ 2022 │ 12 │ 31 │
│ 2000 │ 1 │ 1 │
└──────┴───────┴─────┘
SELECT *
FROM test
WHERE (year, month, day) > (2010, 1, 1);
┌─year─┬─month─┬─day─┐
│ 2022 │ 12 │ 31 │
└──────┴───────┴─────┘
CREATE TABLE test
(
`key` Int64,
`duration` UInt32,
`value` Float64
)
ENGINE = Memory AS
SELECT *
FROM values((1, 42, 66.5), (1, 42, 70), (2, 1, 10), (2, 2, 0));
SELECT * FROM test;
┌─key─┬─duration─┬─value─┐
│ 1 │ 42 │ 66.5 │
│ 1 │ 42 │ 70 │
│ 2 │ 1 │ 10 │
│ 2 │ 2 │ 0 │
└─────┴──────────┴───────┘
-- 각 key에 대해 duration이 가장 큰 value를 찾되, duration이 동일한 경우 가장 큰 value를 선택합니다
SELECT
key,
max(duration),
argMax(value, (duration, value))
FROM test
GROUP BY key
ORDER BY key ASC;
┌─key─┬─max(duration)─┬─argMax(value, tuple(duration, value))─┐
│ 1 │ 42 │ 70 │
│ 2 │ 2 │ 0 │
└─────┴───────────────┴───────────────────────────────────────┘
Nullable(Tuple(T1, T2, …))
실험적 기능SET allow_experimental_nullable_tuple_type = 1 설정이 필요합니다.
이 기능은 실험적 기능이며 향후 버전에서 변경될 수 있습니다.
개별 요소만 NULL이 될 수 있는 Tuple(Nullable(T1), Nullable(T2), ...)와 달리, 전체 튜플을 NULL로 지정할 수 있습니다.
| 유형 | 튜플이 NULL일 수 있음 | 요소가 NULL일 수 있음 |
|---|
Nullable(Tuple(String, Int64)) | ✅ | ❌ |
Tuple(Nullable(String), Nullable(Int64)) | ❌ | ✅ |
예시:
SET allow_experimental_nullable_tuple_type = 1;
CREATE TABLE test (
id UInt32,
data Nullable(Tuple(String, Int64))
) ENGINE = Memory;
INSERT INTO test VALUES (1, ('hello', 42)), (2, NULL);
SELECT * FROM test WHERE data IS NULL;
┌─id─┬─data─┐
│ 2 │ ᴺᵁᴸᴸ │
└────┴──────┘