функция arrayJoin
Это очень необычная функция.
Обычные функции не изменяют набор строк, а лишь изменяют значения в каждой строке (map). Агрегатные функции сжимают набор строк (fold или reduce). Функция arrayJoin
берет каждую строку и генерирует набор строк (unfold).
Эта функция принимает массив в качестве аргумента и размножает исходную строку на несколько строк в зависимости от количества элементов в массиве. Все значения в колонках просто копируются, кроме значений в колонке, где эта функция применяется; она заменяется соответствующим значением из массива.
Если массив пустой, arrayJoin
не производит строк. Чтобы вернуть одну строку, содержащую значение по умолчанию для типа массива, вы можете обернуть его в emptyArrayToSingle, например: arrayJoin(emptyArrayToSingle(...))
.
Например:
Функция arrayJoin
влияет на все секции запроса, включая секцию WHERE
. Обратите внимание, что результат запроса ниже равен 2
, хотя подзапрос вернул 1 строку.
Запрос может использовать несколько функций arrayJoin
. В этом случае преобразование выполняется несколько раз, и строки умножаются. Например:
Лучшие практики
Использование нескольких arrayJoin
с одним и тем же выражением может не давать ожидаемых результатов из-за устранения общих подпроцессов. В таких случаях рассмотрите возможность модификации повторяющихся массивных выражений с помощью дополнительных операций, которые не влияют на результат объединения. Например, arrayJoin(arraySort(arr))
, arrayJoin(arrayConcat(arr, []))
.
Пример:
Обратите внимание на синтаксис ARRAY JOIN
в запросе SELECT, который предоставляет более широкие возможности. ARRAY JOIN
позволяет одновременно преобразовывать несколько массивов с одинаковым количеством элементов.
Пример:
Или вы можете использовать Tuple
.
Пример:
Название arrayJoin
в ClickHouse происходит от его концептуального сходства с операцией JOIN, но применяется к массивам внутри одной строки. В то время как традиционные JOIN объединяют строки из разных таблиц, arrayJoin
"соединяет" каждый элемент массива в строке, производя несколько строк - по одной для каждого элемента массива - при этом дублируя значения других колонок. ClickHouse также предоставляет синтаксис ARRAY JOIN
, который делает эту связь с традиционными операциями JOIN еще более явной, используя привычную терминологию SQL JOIN. Этот процесс также называется "разворачиванием" массива, но термин "join" используется как в названии функции, так и в предложении, потому что он напоминает объединение таблицы с элементами массива, эффективно расширяя набор данных аналогично операциям JOIN.