2020-10-26 10:29:30 +00:00
---
2022-04-09 13:29:05 +00:00
sidebar_position: 61
sidebar_label: "Функция ArrayJoin"
2020-10-26 10:29:30 +00:00
---
2020-04-30 18:19:18 +00:00
# Функция ArrayJoin {#functions_arrayjoin}
2017-10-25 05:27:09 +00:00
2017-03-12 17:58:51 +00:00
Это совсем необычная функция.
Обычные функции не изменяют множество строк, а лишь изменяют значения в каждой строке (map).
Агрегатные функции выполняют свёртку множества строк (fold, reduce).
2022-08-15 19:40:48 +00:00
Функция `arrayJoin` выполняет размножение каждой строки в множество строк (unfold).
2017-03-12 17:58:51 +00:00
Функция принимает в качестве аргумента массив, и размножает исходную строку в несколько строк - по числу элементов массива.
В с е значения в столбцах просто копируются, кроме значения в столбце с применением этой функции - он заменяется на соответствующее значение массива.
Пример:
2020-03-20 18:20:59 +00:00
``` sql
2017-10-25 05:27:09 +00:00
SELECT arrayJoin([1, 2, 3] AS src) AS dst, 'Hello', src
```
2020-03-20 18:20:59 +00:00
``` text
2017-10-25 05:27:09 +00:00
┌─dst─┬─\'Hello\'─┬─src─────┐
│ 1 │ Hello │ [1,2,3] │
│ 2 │ Hello │ [1,2,3] │
│ 3 │ Hello │ [1,2,3] │
└─────┴───────────┴─────────┘
```
2018-10-16 10:47:17 +00:00
2022-08-15 19:40:48 +00:00
Функция `arrayJoin` влияет на все секции запроса, включая секцию `WHERE` . Обратите внимание на результат 2, хотя подзапрос вернул 1 строку.
Пример:
```sql
SELECT sum(1) AS impressions
FROM
(
2022-08-15 19:44:27 +00:00
SELECT ['Istanbul', 'Berlin', 'Bobruisk'] AS cities
2022-08-15 19:40:48 +00:00
)
2022-08-15 19:44:27 +00:00
WHERE arrayJoin(cities) IN ['Istanbul', 'Berlin'];
2022-08-15 19:40:48 +00:00
```
``` text
┌─impressions─┐
│ 2 │
└─────────────┘
```
В запросе может быть использовано несколько функций `arrayJoin` . В этом случае, соответствующее преобразование делается несколько раз и строки перемножаются.
Пример:
```sql
SELECT
sum(1) AS impressions,
arrayJoin(cities) AS city,
arrayJoin(browsers) AS browser
FROM
(
SELECT
2022-08-15 19:44:27 +00:00
['Istanbul', 'Berlin', 'Bobruisk'] AS cities,
2022-08-15 19:40:48 +00:00
['Firefox', 'Chrome', 'Chrome'] AS browsers
)
GROUP BY
2,
3
```
``` text
┌─impressions─┬─city─────┬─browser─┐
2022-08-15 19:44:27 +00:00
│ 2 │ Istanbul │ Chrome │
│ 1 │ Istanbul │ Firefox │
2022-08-15 19:40:48 +00:00
│ 2 │ Berlin │ Chrome │
│ 1 │ Berlin │ Firefox │
│ 2 │ Bobruisk │ Chrome │
│ 1 │ Bobruisk │ Firefox │
└─────────────┴──────────┴─────────┘
```
Обратите внимание на синтаксис [ARRAY JOIN ](../statements/select/array-join.md ) в запросе SELECT, который предоставляет более широкие возможности.
`ARRAY JOIN` позволяет преобразовать несколько массивов с одинаковым количеством элементов за раз.
Пример:
```sql
SELECT
sum(1) AS impressions,
city,
browser
FROM
(
SELECT
2022-08-15 19:44:27 +00:00
['Istanbul', 'Berlin', 'Bobruisk'] AS cities,
2022-08-15 19:40:48 +00:00
['Firefox', 'Chrome', 'Chrome'] AS browsers
)
ARRAY JOIN
cities AS city,
browsers AS browser
GROUP BY
2,
3
```
``` text
┌─impressions─┬─city─────┬─browser─┐
2022-08-15 19:44:27 +00:00
│ 1 │ Istanbul │ Firefox │
2022-08-15 19:40:48 +00:00
│ 1 │ Berlin │ Chrome │
│ 1 │ Bobruisk │ Chrome │
└─────────────┴──────────┴─────────┘
```
Или можно использовать [Tuple ](../data-types/tuple.md )
Пример:
```sql
SELECT
sum(1) AS impressions,
(arrayJoin(arrayZip(cities, browsers)) AS t).1 AS city,
t.2 AS browser
FROM
(
SELECT
2022-08-15 19:44:27 +00:00
['Istanbul', 'Berlin', 'Bobruisk'] AS cities,
2022-08-15 19:40:48 +00:00
['Firefox', 'Chrome', 'Chrome'] AS browsers
)
GROUP BY
2,
3
```
``` text
┌─impressions─┬─city─────┬─browser─┐
2022-08-15 19:44:27 +00:00
│ 1 │ Istanbul │ Firefox │
2022-08-15 19:40:48 +00:00
│ 1 │ Berlin │ Chrome │
│ 1 │ Bobruisk │ Chrome │
└─────────────┴──────────┴─────────┘
```