Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

Tuple(T1, T2, ...)

Tuple из элементов, каждый из которых имеет отдельный тип. Tuple должен содержать как минимум один элемент.

Tuple используются для временной группировки столбцов. Столбцы можно группировать, когда в запросе используется выражение IN, а также для указания некоторых формальных параметров лямбда-функций. Подробнее см. в разделах Операторы IN и Функции высшего порядка.

Tuple могут быть результатом запроса. В этом случае в текстовых форматах, кроме JSON, значения разделяются запятыми в (). В форматах JSON Tuple выводятся как массивы (в []).

Создание Tuple

Для создания Tuple можно использовать функцию:

tuple(T1, T2, ...)

Пример создания Tuple:

SELECT tuple(1, 'a') AS x, toTypeName(x)
┌─x───────┬─toTypeName(tuple(1, 'a'))─┐
│ (1,'a') │ Tuple(UInt8, String)      │
└─────────┴───────────────────────────┘

Tuple может состоять из одного элемента

Пример:

SELECT tuple('a') AS x;
┌─x─────┐
│ ('a') │
└───────┘

Синтаксис (tuple_element1, tuple_element2) можно использовать, чтобы создать Tuple из нескольких элементов без вызова функции 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           │
└─────────┴────────────────────────────────────────┴─────────────┘

Определение типов данных

При создании Tuple на лету ClickHouse определяет типы аргументов Tuple как минимальные типы, в которые помещаются переданные значения. Если значение — NULL, тип определяется как Nullable.

Пример автоматического определения типа данных:

SELECT tuple(1, NULL) AS x, toTypeName(x)
┌─x─────────┬─toTypeName(tuple(1, NULL))──────┐
│ (1, NULL) │ Tuple(UInt8, Nullable(Nothing)) │
└───────────┴─────────────────────────────────┘

Обращение к элементам Tuple

К элементам Tuple можно обращаться по имени или индексу:

Querysql
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; -- по индексу
Responsetext
┌─a.s─┐
│ y   │
│ x   │
└─────┘

┌─tupleElement(a, 2)─┐
│                 10 │
│                -10 │
└────────────────────┘

Операции сравнения с Tuple

Два значения Tuple сравниваются последовательно: их элементы сопоставляются слева направо. Если элемент первого Tuple больше (меньше), чем соответствующий элемент второго Tuple, то первый Tuple больше (меньше) второго; в противном случае (если оба элемента равны) сравнивается следующий элемент.

Пример:

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;

Nullable(Tuple(T1, T2, …))

Позволяет всему Tuple принимать значение NULL, в отличие от Tuple(Nullable(T1), Nullable(T2), ...), где значение NULL могут принимать только отдельные элементы.

Тип Tuple может быть NULL Элементы могут быть NULL
Nullable(Tuple(String, Int64))
Tuple(Nullable(String), Nullable(Int64))

Пример:

SET enable_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 │ ᴺᵁᴸᴸ │
└────┴──────┘
Navigation