ClickHouse/docs/ru/sql-reference/functions/array-join.md

141 lines
4.6 KiB
Markdown
Raw Normal View History

---
2022-08-26 17:37:11 +00:00
slug: /ru/sql-reference/functions/array-join
sidebar_position: 61
sidebar_label: "Функция ArrayJoin"
---
# Функция ArrayJoin {#functions_arrayjoin}
Это совсем необычная функция.
Обычные функции не изменяют множество строк, а лишь изменяют значения в каждой строке (map).
Агрегатные функции выполняют свёртку множества строк (fold, reduce).
2022-08-15 19:40:48 +00:00
Функция `arrayJoin` выполняет размножение каждой строки в множество строк (unfold).
Функция принимает в качестве аргумента массив, и размножает исходную строку в несколько строк - по числу элементов массива.
Все значения в столбцах просто копируются, кроме значения в столбце с применением этой функции - он заменяется на соответствующее значение массива.
Пример:
``` sql
SELECT arrayJoin([1, 2, 3] AS src) AS dst, 'Hello', src
```
``` text
┌─dst─┬─\'Hello\'─┬─src─────┐
│ 1 │ Hello │ [1,2,3] │
│ 2 │ Hello │ [1,2,3] │
│ 3 │ Hello │ [1,2,3] │
└─────┴───────────┴─────────┘
```
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 │
└─────────────┴──────────┴─────────┘
```