카테고리:

집계 함수 (일반) , 윈도우 함수 (일반)

LISTAGG

delimiter 문자열로 구분된 연결된 입력 값을 반환합니다.

구문

집계 함수

LISTAGG( [ DISTINCT ] <expr1> [, <delimiter> ] ) [ WITHIN GROUP ( <orderby_clause> ) ]

윈도우 함수

LISTAGG( [ DISTINCT ] <expr1> [, <delimiter> ] )
    [ WITHIN GROUP ( <orderby_clause> ) ]
    OVER ( [ PARTITION BY <expr2> ] )

인자

expr1

목록에 넣을 값을 결정하는 식(일반적으로 열 이름)입니다. 식은 문자열로 평가되거나, 문자열로 캐스팅될 수 있는 데이터 타입으로 평가되어야 합니다.

delimiter

문자열 또는 문자열로 평가되는 식입니다. 실제로 이는 일반적으로 단일 문자 문자열입니다. 문자열은 아래 예와 같이 작은따옴표로 묶어야 합니다.

delimiter 문자열을 지정하지 않는 경우, 빈 문자열이 delimiter 로 사용됩니다.

delimiter 는 상수여야 합니다.

expr2

이 식은 파티션의 행을 그룹화하는 데 사용됩니다.

orderby_clause

목록에서 값의 순서를 결정하는 식(일반적으로 열 이름)입니다.

반환

delimiter 로 구분된, NULL 이외의 모든 입력 값을 포함하는 문자열을 반환합니다.

(이는 《목록》을 반환하지 않는다는 점에 유의하십시오(예: ARRAY를 반환하지 않으며, NULL 이외의 모든 입력 값을 포함하는 단일 문자열을 반환합니다.)

사용법 노트

  • 이 함수에는 DISTINCT 가 지원됩니다.

  • WITHIN GROUP (<orderby_절>) 을 지정하지 않으면 각 목록 내의 요소 순서를 예측할 수 없습니다. (WITHIN GROUP 절 외부의 ORDER BY 절은 행 내 목록 요소의 순서가 아니라 출력 행의 순서에 적용됩니다.)

  • DISTINCTWITHIN GROUP 을 지정하는 경우, 둘 다 동일 열을 참조해야 합니다. 예:

    SELECT listagg(DISTINCT O_ORDERKEY) WITHIN GROUP (ORDER BY O_ORDERKEY) ...;
    

    DISTINCTWITHIN GROUP 에 대해 서로 다른 열을 지정하면 다음과 같이 오류가 발생합니다.

    SELECT listagg(DISTINCT O_ORDERKEY) WITHIN GROUP (ORDER BY O_ORDERSTATUS) ...;
    
    SQL compilation error: [ORDERS.O_ORDERSTATUS] is not a valid order by expression
    

    DISTINCTWITHIN GROUP 에 대해 동일 열을 지정하거나 DISTINCT 를 생략해야 합니다.

  • NULL 또는 빈 입력 값과 관련하여:

    • 입력이 비어 있으면 빈 문자열이 반환됩니다.

    • 모든 입력 식이 NULL로 평가되면 출력은 빈 문자열입니다.

    • 모든 입력 식이 아니라 일부 식이 NULL로 평가되면 출력에는 NULL 이외의 모든 값이 포함되고 NULL 값은 제외됩니다.

  • 윈도우 함수로서 사용할 때 이 함수는 다음을 지원하지 않습니다.

    • OVER() 절의 ORDER BY 하위 절.

    • 윈도우 프레임.

데이터 정렬 세부 정보

  • The collation of the result is the same as the collation of the input.

  • ORDER BY 하위 절이 데이터 정렬이 있는 식을 지정한 경우, 목록 내의 요소는 데이터 정렬에 따라 정렬됩니다.

  • delimiter 는 데이터 정렬 사양을 사용할 수 없습니다.

  • ORDER BY 내에서 데이터 정렬을 지정해도 이는 결과의 데이터 정렬에 영향을 미치지 않습니다. 예를 들어, 아래 문에는 두 개의 ORDER BY 절이 포함되어 있는데, 하나는 LISTAGG 용이고 다른 하나는 쿼리 결과용입니다. 첫 번째 절 내에서 데이터 정렬을 지정해도 이는 두 번째 절의 데이터 정렬에 영향을 미치지 않습니다. 두 ORDER BY 절에서 출력 데이터를 정렬해야 하는 경우, 두 절에서 명시적으로 데이터 정렬을 지정해야 합니다.

    select listagg(x, ', ') within group (ORDER BY last_name collate 'sp')
        from table1
        ORDER BY last_name;
    

SELECT listagg(O_ORDERKEY, ' ')
    FROM orders WHERE O_TOTALPRICE > 450000;

---------------------------------------------+
          LISTAGG(O_ORDERKEY, ' ')           |
---------------------------------------------+
 41445 55937 67781 80550 95808 101700 103136 |
---------------------------------------------+
SELECT listagg(DISTINCT O_ORDERSTATUS, '|')
    FROM orders WHERE O_TOTALPRICE > 450000;

--------------------------------------+
 LISTAGG(DISTINCT O_ORDERSTATUS, '|') |
--------------------------------------+
 F|O                                  |
--------------------------------------+
SELECT O_ORDERSTATUS, listagg(O_CLERK, ', ') WITHIN GROUP (ORDER BY O_TOTALPRICE DESC)
    FROM orders WHERE O_TOTALPRICE > 450000 GROUP BY O_ORDERSTATUS;

---------------+--------------------------------------------------------------------+
 O_ORDERSTATUS |  LISTAGG(O_CLERK, ', ') WITHIN GROUP (ORDER BY O_TOTALPRICE DESC)  |
---------------+--------------------------------------------------------------------+
 O             | Clerk#000000220, Clerk#000000411, Clerk#000000114                  |
 F             | Clerk#000000508, Clerk#000000136, Clerk#000000521, Clerk#000000386 |
---------------+--------------------------------------------------------------------+

다음 예는 LISTAGG 를 사용한 데이터 정렬을 보여줍니다. 다른 데이터 정렬 사양을 사용한 출력 순서의 차이에 유의하십시오.

-- Collation
SELECT LISTAGG(spanish_phrase, '|') 
        WITHIN GROUP (ORDER BY COLLATE(spanish_phrase, 'sp'))
    FROM collation_demo
    GROUP BY english_phrase;
+---------------------------------------------------------------+
| LISTAGG(SPANISH_PHRASE, '|')                                  |
|         WITHIN GROUP (ORDER BY COLLATE(SPANISH_PHRASE, 'SP')) |
|---------------------------------------------------------------|
| piña colada|Pinatubo (Mount)|pint|Pinta                       |
+---------------------------------------------------------------+
-- Different collation.
SELECT LISTAGG(spanish_phrase, '|') 
        WITHIN GROUP (ORDER BY COLLATE(spanish_phrase, 'utf8'))
    FROM collation_demo
    GROUP BY english_phrase;
+-----------------------------------------------------------------+
| LISTAGG(SPANISH_PHRASE, '|')                                    |
|         WITHIN GROUP (ORDER BY COLLATE(SPANISH_PHRASE, 'UTF8')) |
|-----------------------------------------------------------------|
| Pinatubo (Mount)|Pinta|pint|piña colada                         |
+-----------------------------------------------------------------+
맨 위로 이동