Перейти к основному содержанию
Вложенная структура данных похожа на таблицу внутри ячейки. Параметры вложенной структуры данных — имена столбцов и типы — задаются так же, как в запросе CREATE TABLE. Каждой строке таблицы может соответствовать любое количество строк во вложенной структуре данных.
Избегайте точек в именах столбцовИмена столбцов, содержащие точки, столбцы с общим префиксом до точки и столбцы типа Array могут интерпретироваться как часть развёрнутой структуры Nested, если flatten_nested = 1 (значение по умолчанию). Это может привести к неожиданной проверке длины массивов при вставке и ограничениям на переименование.По возможности не используйте точки в именах столбцов. Вместо точек используйте символ подчёркивания (_) или другой разделитель, если только вам не нужна именно семантика Nested.
Пример:
Приведённый выше DDL-оператор CREATE TABLE объявляет вложенную структуру данных Goals, которая содержит данные о конверсиях, то есть о достигнутых целях. Каждая строка в таблице ‘visits’ может соответствовать нулю, одной или нескольким конверсиям. Если настройка flatten_nested установлена в 0 (по умолчанию flatten_nested=1), поддерживаются произвольные уровни вложенности. В большинстве случаев при работе с вложенной структурой данных её столбцы задаются именами, разделёнными точкой. Эти столбцы образуют массивы соответствующих типов. Все массивы столбцов в одной вложенной структуре данных имеют одинаковую длину. Например:
Проще всего представить вложенную структуру данных как набор из нескольких массивов столбцов одинаковой длины.

Фильтрация столбцов Nested в WHERE

Поскольку каждый столбец структуры Nested хранится как Array, обращение к нему в предложении WHERE возвращает для каждой строки весь массив, а не отдельный элемент. Нельзя напрямую сравнивать вложенный столбец со скалярным значением, поэтому вместо этого нужно использовать функции для работы с массивами. Например, этот запрос не просто незаметно возвращает ноль строк — он вызывает исключение, потому что Goals.ID имеет тип Array(UInt32), а equals(Array(UInt32), UInt32) не является допустимым сравнением:
Используйте has, чтобы проверить, есть ли в массиве определённое значение:
Используйте arrayExists, если условие сложнее:
Вы можете фильтровать массивы по длине с помощью length или исключать пустые массивы с помощью notEmpty:
Чтобы фильтровать по отдельным элементам вложенной структуры, а не по целым строкам, сначала используйте ARRAY JOIN, чтобы развернуть массивы. После ARRAY JOIN каждый элемент становится отдельной строкой, поэтому предложение WHERE применяется к скалярным значениям. Дополнительную информацию см. в разделе предложение ARRAY JOIN. Пример:
Нельзя выполнить SELECT для всей вложенной структуры данных целиком. Можно только явно перечислить отдельные столбцы, входящие в её состав.

Вставка данных

Для запроса INSERT все массивы столбцов-компонентов вложенной структуры данных нужно передавать отдельно, как если бы это были массивы отдельных столбцов. При вставке система проверяет, что все они имеют одинаковую длину. Каждый вложенный подстолбец указывается в списке столбцов в точечной нотации (Goals.ID, Goals.Serial, …), а соответствующие значения задаются как массивы:
Все массивы вложенных подстолбцов в пределах одной строки должны иметь одинаковую длину. Если длины не совпадают, возникает ошибка:
Для запроса DESCRIBE столбцы вложенной структуры данных также перечисляются отдельно.

Ограничения ALTER

Запросы ALTER для вложенных структур данных имеют следующие ограничения: Добавление подстолбцов работает как обычно. Вы можете добавить новый подстолбец в существующую структуру Nested:
Подстолбцы можно удалять и по отдельности:
Изменение типа подстолбца поддерживается и запускает мутацию (перезапись данных):
Переименование имеет ограничения. Вы можете переименовать подстолбец в рамках одной и той же вложенной структуры:
Однако вы не можете:
  • Переименовать всю вложенную структуру целиком (например, Goals в Conversions).
  • Переместить подстолбец в другую вложенную структуру (например, Goals.ID в OtherNested.ID).
  • Переместить подстолбец из вложенной структуры наружу или, наоборот, внутрь неё (например, Goals.ID в GoalID и наоборот).
Последнее изменение 2 июля 2026 г.