카테고리:

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

LISTAGG

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

구문

집계 함수

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

윈도우 함수

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

인자

필수:

expr1

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

OVER()

OVER 절은 함수가 윈도우 함수로 사용되고 있음을 지정합니다. 자세한 내용은 윈도우 함수 섹션을 참조하십시오.

선택 사항:

DISTINCT

목록에서 중복된 값을 제거합니다.

delimiter

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

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

delimiter 는 상수여야 합니다.

WITHIN GROUP orderby_clause

목록의 각 그룹에 대한 값의 순서를 결정하는 하나 이상의 식(일반적으로 열 이름)을 포함하는 절입니다.

WITHIN GROUP(ORDER BY) 구문은 SELECT 문의 기본 ORDER BY 절과 동일한 매개 변수를 지원합니다. ORDER BY 섹션을 참조하십시오.

PARTITION BY expr2

식(일반적으로 열 이름)을 지정하는 윈도우 함수 하위 절입니다. 이 식은 함수가 적용되기 전에 입력 행을 그룹화하는 파티션을 정의합니다. 자세한 내용은 윈도우 함수 섹션을 참조하십시오.

반환

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

이 함수는 《목록》 또는 배열을 반환하지 않으며, NULL 이외의 모든 입력값을 포함하는 단일 문자열을 반환합니다.

사용법 노트

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

  • WITHIN GROUP(ORDER BY)의 식에 숫자를 지정하면 이 숫자는 SELECT 목록에 있는 열의 서수 위치가 아닌 숫자 상수로 구문 분석됩니다. 따라서 숫자를 WITHIN GROUP(ORDER BY) 식으로 지정하지 마십시오.

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

    SELECT LISTAGG(DISTINCT O_ORDERKEY) WITHIN GROUP (ORDER BY O_ORDERKEY) ...;
    
    Copy

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

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

    DISTINCT 및 WITHIN 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;
    
    Copy

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

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

--------------------------------------+
 LISTAGG(DISTINCT O_ORDERSTATUS, '|') |
--------------------------------------+
 F|O                                  |
--------------------------------------+
Copy
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 |
---------------+--------------------------------------------------------------------+
Copy

다음 예는 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                         |
+-----------------------------------------------------------------+
Copy