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

Клауза ARRAY JOIN

Это обычная операция для таблиц, содержащих колонку массива, чтобы получить новую таблицу, в которой есть колонка с каждым отдельным элементом массива из этой первоначальной колонки, в то время как значения других колонок дублируются. Это базовый случай того, что делает клауза ARRAY JOIN.

Её название происходит от того, что на это можно взглянуть как на выполнение JOIN с массивом или вложенной структурой данных. Намерение похоже на функцию arrayJoin, но функциональность клаузы шире.

Синтаксис:

Поддерживаемые типы ARRAY JOIN перечислены ниже:

  • ARRAY JOIN - В базовом случае пустые массивы не включаются в результат JOIN.
  • LEFT ARRAY JOIN - Результат JOIN содержит строки с пустыми массивами. Значение для пустого массива устанавливается в значение по умолчанию для типа элемента массива (обычно 0, пустая строка или NULL).

Примеры базового ARRAY JOIN

Примеры ниже демонстрируют использование клауз ARRAY JOIN и LEFT ARRAY JOIN. Давайте создадим таблицу с колонкой типа Array и вставим в неё значения:

Пример ниже использует клаузу ARRAY JOIN:

Следующий пример использует клаузу LEFT ARRAY JOIN:

Использование псевдонимов

Можно указать псевдоним для массива в клаузе ARRAY JOIN. В этом случае элемент массива можно будет получить по этому псевдониму, а сам массив будет доступен по оригинальному имени. Пример:

Используя псевдонимы, можно выполнять ARRAY JOIN с внешним массивом. Например:

Несколько массивов могут быть разделены запятыми в клаузе ARRAY JOIN. В этом случае JOIN выполняется с ними одновременно (прямое сложение, а не декартово произведение). Обратите внимание, что по умолчанию все массивы должны иметь одинаковый размер. Пример:

Пример ниже использует функцию arrayEnumerate:

Несколько массивов разного размера могут быть соединены с использованием: SETTINGS enable_unaligned_array_join = 1. Пример:

ARRAY JOIN с вложенной структурой данных

ARRAY JOIN также работает с вложенными структурами данных:

При указании имен вложенных структур данных в ARRAY JOIN значение остается тем же, что и в ARRAY JOIN со всеми элементами массива, из которых она состоит. Примеры перечислены ниже:

Этот вариант также имеет смысл:

Можно использовать псевдоним для вложенной структуры данных, чтобы выбрать либо результат JOIN, либо исходный массив. Пример:

Пример использования функции arrayEnumerate:

Подробности реализации

Порядок выполнения запроса оптимизирован при выполнении ARRAY JOIN. Хотя ARRAY JOIN всегда должен быть указан перед клаузами WHERE/PREWHERE в запросе, на самом деле их можно выполнять в любом порядке, если результат ARRAY JOIN используется для фильтрации. Порядок обработки контролируется оптимизатором запроса.

Непризнаваемость с встраиванием функций с коротким прерыванием

Встраивание функций с коротким прерыванием — это функция, которая оптимизирует выполнение сложных выражений в специфических функциях, таких как if, multiIf, and и or. Она предотвращает потенциальные исключения, такие как деление на ноль, при выполнении этих функций.

arrayJoin всегда выполняется и не поддерживается для встраивания функций с коротким прерыванием. Это связано с тем, что это уникальная функция, обрабатываемая отдельно от всех других функций во время анализа и выполнения запроса и требует дополнительной логики, которая не работает с функциями короткого прерывания. Причина в том, что количество строк в результате зависит от результата arrayJoin, и это слишком сложно и затратно для реализации ленивого выполнения arrayJoin.