Перейти к основному содержимому
Перейти к основному содержимому

Array(T)

Массив элементов типа T, с индексом массива, начиная с 1. T может быть любым типом данных, включая массив.

Создание массива

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

array(T)

Также можно использовать квадратные скобки.

[]

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

SELECT array(1, 2) AS x, toTypeName(x)
┌─x─────┬─toTypeName(array(1, 2))─┐
│ [1,2] │ Array(UInt8)            │
└───────┴─────────────────────────┘
SELECT [1, 2] AS x, toTypeName(x)
┌─x─────┬─toTypeName([1, 2])─┐
│ [1,2] │ Array(UInt8)       │
└───────┴────────────────────┘

Работа с типами данных

При создании массива на лету ClickHouse автоматически определяет тип аргумента как самый узкий тип данных, который может хранить все перечисленные аргументы. Если есть любые Nullable или литеральные NULL значения, тип элемента массива также становится Nullable.

Если ClickHouse не может определить тип данных, он генерирует исключение. Например, это происходит, когда вы пытаетесь создать массив со строками и числами одновременно (SELECT array(1, 'a')).

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

SELECT array(1, 2, NULL) AS x, toTypeName(x)
┌─x──────────┬─toTypeName(array(1, 2, NULL))─┐
│ [1,2,NULL] │ Array(Nullable(UInt8))        │
└────────────┴───────────────────────────────┘

Если вы попытаетесь создать массив несовместимых типов данных, ClickHouse выдает исключение:

SELECT array(1, 'a')
Received exception from server (version 1.1.54388):
Code: 386. DB::Exception: Received from localhost:9000, 127.0.0.1. DB::Exception: There is no supertype for types UInt8, String because some of them are String/FixedString and some of them are not.

Размер массива

Можно узнать размер массива, используя подпроекцию size0, не читая целую колонку. Для многомерных массивов вы можете использовать sizeN-1, где N - это нужная размерность.

Пример

Запрос:

CREATE TABLE t_arr (`arr` Array(Array(Array(UInt32)))) ENGINE = MergeTree ORDER BY tuple();

INSERT INTO t_arr VALUES ([[[12, 13, 0, 1],[12]]]);

SELECT arr.size0, arr.size1, arr.size2 FROM t_arr;

Результат:

┌─arr.size0─┬─arr.size1─┬─arr.size2─┐
│         1 │ [2]       │ [[4,1]]   │
└───────────┴───────────┴───────────┘

Чтение вложенных подпроекций из массива

Если вложенный тип T внутри Array имеет подпроекции (например, если это именованный кортеж), вы можете читать его подпроекции из типа Array(T) с теми же именами подпроекций. Тип подпроекции будет Array типа оригинальной подпроекции.

Пример

CREATE TABLE t_arr (arr Array(Tuple(field1 UInt32, field2 String))) ENGINE = MergeTree ORDER BY tuple();
INSERT INTO t_arr VALUES ([(1, 'Hello'), (2, 'World')]), ([(3, 'This'), (4, 'is'), (5, 'subcolumn')]);
SELECT arr.field1, toTypeName(arr.field1), arr.field2, toTypeName(arr.field2) from t_arr;
┌─arr.field1─┬─toTypeName(arr.field1)─┬─arr.field2────────────────┬─toTypeName(arr.field2)─┐
│ [1,2]      │ Array(UInt32)          │ ['Hello','World']         │ Array(String)          │
│ [3,4,5]    │ Array(UInt32)          │ ['This','is','subcolumn'] │ Array(String)          │
└────────────┴────────────────────────┴───────────────────────────┴────────────────────────┘