mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-12-11 17:02:25 +00:00
140 lines
4.6 KiB
Markdown
140 lines
4.6 KiB
Markdown
---
|
||
sidebar_position: 61
|
||
sidebar_label: "Функция ArrayJoin"
|
||
---
|
||
|
||
# Функция ArrayJoin {#functions_arrayjoin}
|
||
|
||
Это совсем необычная функция.
|
||
|
||
Обычные функции не изменяют множество строк, а лишь изменяют значения в каждой строке (map).
|
||
Агрегатные функции выполняют свёртку множества строк (fold, reduce).
|
||
Функция `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] │
|
||
└─────┴───────────┴─────────┘
|
||
```
|
||
|
||
Функция `arrayJoin` влияет на все секции запроса, включая секцию `WHERE`. Обратите внимание на результат 2, хотя подзапрос вернул 1 строку.
|
||
|
||
Пример:
|
||
|
||
```sql
|
||
SELECT sum(1) AS impressions
|
||
FROM
|
||
(
|
||
SELECT ['Istanbul', 'Berlin', 'Bobruisk'] AS cities
|
||
)
|
||
WHERE arrayJoin(cities) IN ['Istanbul', 'Berlin'];
|
||
```
|
||
|
||
``` text
|
||
┌─impressions─┐
|
||
│ 2 │
|
||
└─────────────┘
|
||
```
|
||
|
||
В запросе может быть использовано несколько функций `arrayJoin`. В этом случае, соответствующее преобразование делается несколько раз и строки перемножаются.
|
||
|
||
Пример:
|
||
|
||
```sql
|
||
SELECT
|
||
sum(1) AS impressions,
|
||
arrayJoin(cities) AS city,
|
||
arrayJoin(browsers) AS browser
|
||
FROM
|
||
(
|
||
SELECT
|
||
['Istanbul', 'Berlin', 'Bobruisk'] AS cities,
|
||
['Firefox', 'Chrome', 'Chrome'] AS browsers
|
||
)
|
||
GROUP BY
|
||
2,
|
||
3
|
||
```
|
||
|
||
``` text
|
||
┌─impressions─┬─city─────┬─browser─┐
|
||
│ 2 │ Istanbul │ Chrome │
|
||
│ 1 │ Istanbul │ Firefox │
|
||
│ 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
|
||
['Istanbul', 'Berlin', 'Bobruisk'] AS cities,
|
||
['Firefox', 'Chrome', 'Chrome'] AS browsers
|
||
)
|
||
ARRAY JOIN
|
||
cities AS city,
|
||
browsers AS browser
|
||
GROUP BY
|
||
2,
|
||
3
|
||
```
|
||
|
||
``` text
|
||
┌─impressions─┬─city─────┬─browser─┐
|
||
│ 1 │ Istanbul │ Firefox │
|
||
│ 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
|
||
['Istanbul', 'Berlin', 'Bobruisk'] AS cities,
|
||
['Firefox', 'Chrome', 'Chrome'] AS browsers
|
||
)
|
||
GROUP BY
|
||
2,
|
||
3
|
||
```
|
||
|
||
``` text
|
||
┌─impressions─┬─city─────┬─browser─┐
|
||
│ 1 │ Istanbul │ Firefox │
|
||
│ 1 │ Berlin │ Chrome │
|
||
│ 1 │ Bobruisk │ Chrome │
|
||
└─────────────┴──────────┴─────────┘
|
||
```
|