Функция arrayJoin
Это очень необычная функция.
Обычные функции не изменяют набор строк, а лишь изменяют значения в каждой строке (map).
Агрегатные функции сжимают набор строк (fold или reduce).
Функция arrayJoin берёт каждую строку и порождает из неё набор строк (unfold).
Эта функция принимает массив в качестве аргумента и разворачивает исходную строку в несколько строк в количестве, равном числу элементов в массиве. Все значения в столбцах просто копируются, за исключением значения в столбце, к которому применяется эта функция; оно заменяется соответствующим значением из массива.
Если массив пустой, arrayJoin не возвращает ни одной строки.
Чтобы вернуть одну строку, содержащую значение по умолчанию для типа массива, можно обернуть его в emptyArrayToSingle, например: arrayJoin(emptyArrayToSingle(...)).
Например:
Функция arrayJoin влияет на все части запроса, включая раздел WHERE. Обратите внимание, что результат запроса ниже равен 2, несмотря на то что подзапрос вернул одну строку.
Запрос может использовать несколько функций arrayJoin. В этом случае преобразование выполняется несколько раз, в результате чего умножается число строк.
Например:
Рекомендации по использованию
Использование нескольких arrayJoin с одним и тем же выражением может привести к неожиданным результатам из-за устранения общих подвыражений.
В таких случаях имеет смысл модифицировать повторяющиеся выражения с массивами с помощью дополнительных операций, которые не влияют на результат операции join. Например, 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.