Массив элементов типа T, в котором индексация начинается с 1. 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 выдаст исключение:
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]] │
└───────────┴───────────┴───────────┘
Чтение вложенных подстолбцов из Array
Если вложенный тип 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) │
└────────────┴────────────────────────┴───────────────────────────┴────────────────────────┘
Последнее изменение 10 июня 2026 г.