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 можно обращаться по имени или индексу:
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 │
└────────────────────┘Операции сравнения с 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 │ ᴺᵁᴸᴸ │
└────┴──────┘