LISTAGG¶
delimiter
문자열로 구분된 연결된 입력 값을 반환합니다.
구문¶
집계 함수
LISTAGG( [ DISTINCT ] <expr1> [, <delimiter> ] ) [ WITHIN GROUP ( <orderby_clause> ) ]
윈도우 함수
LISTAGG( [ DISTINCT ] <expr1> [, <delimiter> ] )
[ WITHIN GROUP ( <orderby_clause> ) ]
OVER ( [ PARTITION BY <expr2> ] )
인자¶
필수:
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) ...;
DISTINCT 및 WITHIN 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
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;
예¶
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 | +-----------------------------------------------------------------+