메인 콘텐츠로 건너뛰기
이 함수는 매우 독특한 함수입니다. 일반 함수는 행 집합을 바꾸지 않고 각 행의 값만 변경합니다(map). 집계 함수는 행 집합을 압축합니다(fold 또는 reduce). arrayJoin 함수는 각 행을 여러 행의 집합으로 펼칩니다(unfold). 이 함수는 배열을 인수로 받아, 배열의 원소 수만큼 원본 행을 여러 개의 행으로 확장합니다. 모든 컬럼의 값은 단순히 복사되지만, 이 함수가 적용된 컬럼의 값만 예외로 해당 배열의 각 값으로 대체됩니다.
배열이 비어 있으면 arrayJoin은 아무 행도 생성하지 않습니다. 배열 유형의 기본값을 포함한 단일 행을 반환하려면 emptyArrayToSingle로 감쌀 수 있습니다. 예: arrayJoin(emptyArrayToSingle(...)).
예시:
Query
SELECT arrayJoin([1, 2, 3] AS src) AS dst, 'Hello', src
Response
┌─dst─┬─\'Hello\'─┬─src─────┐
│   1 │ Hello     │ [1,2,3] │
│   2 │ Hello     │ [1,2,3] │
│   3 │ Hello     │ [1,2,3] │
└─────┴───────────┴─────────┘
arrayJoin 함수는 WHERE 절을 포함한 쿼리의 모든 부분에 영향을 줍니다. 아래 쿼리의 결과는 서브쿼리가 1개의 행을 반환했음에도 2라는 점에 유의하십시오.
Query
SELECT sum(1) AS impressions
FROM
(
    SELECT ['Istanbul', 'Berlin', 'Babruysk'] AS cities
)
WHERE arrayJoin(cities) IN ['Istanbul', 'Berlin'];
Response
┌─impressions─┐
│           2 │
└─────────────┘
하나의 쿼리에서 여러 arrayJoin 함수를 사용할 수 있습니다. 이 경우 변환이 여러 번 수행되어 행 수가 늘어납니다. 예시:
Query
SELECT
    sum(1) AS impressions,
    arrayJoin(cities) AS city,
    arrayJoin(browsers) AS browser
FROM
(
    SELECT
        ['Istanbul', 'Berlin', 'Babruysk'] AS cities,
        ['Firefox', 'Chrome', 'Chrome'] AS browsers
)
GROUP BY
    2,
    3
Response
┌─impressions─┬─city─────┬─browser─┐
│           2 │ Istanbul │ Chrome  │
│           1 │ Istanbul │ Firefox │
│           2 │ Berlin   │ Chrome  │
│           1 │ Berlin   │ Firefox │
│           2 │ Babruysk │ Chrome  │
│           1 │ Babruysk │ Firefox │
└─────────────┴──────────┴─────────┘

모범 사례

동일한 표현식에 arrayJoin을 여러 번 사용하면 공통 부분 표현식이 제거되어 예상한 결과가 나오지 않을 수 있습니다. 이 경우에는 조인 결과에 영향을 주지 않는 추가 연산을 사용해 반복되는 배열 표현식을 변형하는 것이 좋습니다. 예를 들어 arrayJoin(arraySort(arr)), arrayJoin(arrayConcat(arr, [])) 예시:
Query
SELECT
    arrayJoin(dice) AS first_throw,
    /* arrayJoin(dice) as second_throw */ -- 기술적으로는 올바르지만, 결과 집합을 소멸시킵니다
    arrayJoin(arrayConcat(dice, [])) AS second_throw -- 재평가를 강제하기 위해 의도적으로 표현식을 변경
FROM (
    SELECT [1, 2, 3, 4, 5, 6] AS dice
);
더 폭넓게 활용할 수 있도록 해주는 SELECT 쿼리의 ARRAY JOIN 구문에 유의하십시오. ARRAY JOIN을 사용하면 요소 수가 같은 여러 배열을 한 번에 변환할 수 있습니다. 예시:
Query
SELECT
    sum(1) AS impressions,
    city,
    browser
FROM
(
    SELECT
        ['Istanbul', 'Berlin', 'Babruysk'] AS cities,
        ['Firefox', 'Chrome', 'Chrome'] AS browsers
)
ARRAY JOIN
    cities AS city,
    browsers AS browser
GROUP BY
    2,
    3
Response
┌─impressions─┬─city─────┬─browser─┐
│           1 │ Istanbul │ Firefox │
│           1 │ Berlin   │ Chrome  │
│           1 │ Babruysk │ Chrome  │
└─────────────┴──────────┴─────────┘
또는 Tuple을 사용할 수 있습니다 예시:
Query
SELECT
    sum(1) AS impressions,
    (arrayJoin(arrayZip(cities, browsers)) AS t).1 AS city,
    t.2 AS browser
FROM
(
    SELECT
        ['Istanbul', 'Berlin', 'Babruysk'] AS cities,
        ['Firefox', 'Chrome', 'Chrome'] AS browsers
)
GROUP BY
    2,
    3
Row
┌─impressions─┬─city─────┬─browser─┐
│           1 │ Istanbul │ Firefox │
│           1 │ Berlin   │ Chrome  │
│           1 │ Babruysk │ Chrome  │
└─────────────┴──────────┴─────────┘
ClickHouse에서 arrayJoin이라는 이름은 JOIN 연산과 개념적으로 비슷하지만, 이를 단일 행 내부의 배열에 적용한다는 점에서 유래했습니다. 기존 JOIN은 서로 다른 테이블의 행을 결합하지만, arrayJoin은 한 행에 있는 배열의 각 요소를 “조인”하듯 펼쳐 각 배열 요소마다 하나의 행을 만들고, 나머지 컬럼 값은 그대로 복제합니다. ClickHouse는 ARRAY JOIN 절 구문도 제공하는데, 익숙한 SQL JOIN 용어를 사용해 이러한 기존 JOIN 연산과의 관계를 더욱 분명하게 보여줍니다. 이 과정은 배열을 “펼친다”고도 표현하지만, 함수 이름과 절 모두에서 “join”이라는 용어를 사용하는 이유는 테이블을 배열 요소와 조인하는 것처럼 보이기 때문이며, 결과적으로 데이터셋을 JOIN 연산과 유사한 방식으로 확장합니다.
마지막 수정일 2026년 6월 10일