ARRAY_AGG 집계 함수
ARRAY_AGG 함수는 요소 세트를 배열로 집계합니다.
ARRAY_AGG 집계 함수의 호출은 결과 배열 유형을 기반으로 합니다.
일반 배열 집계
>>-ARRAY_AGG--(--| element-expression |--+----------------------------------+--)->< | .-,------------------. | | V .-ASC--. | | '-ORDER BY----sort-key--+------+-+-' '-DESC-' element-expression |--+-expression--------------------------+----------------------| +-row-expression----------------------+ | .-,----------. | | V | | '-(--expression--,----expression-+--)-'
연관 배열 집계
>>-ARRAY_AGG--(--index-expression--,--| element-expression |--)->< element-expression |--+-expression--------------------------+----------------------| +-row-expression----------------------+ | .-,----------. | | V | | '-(--expression--,----expression-+--)-'
스키마는 SYSIBM입니다.
- 일반 배열 집계
-
- element-expression
- 배열의 요소의 소스를 지정합니다.
- expression
- 배열의 요소 값을 지정하는 표현식입니다. 표현식의 데이터 유형은 CREATE TYPE(배열)문에 지정할 수 있는 데이터 유형입니다(SQLSTATE 429C2).
- row-expression
- 행 데이터 유형을 배열 요소로 가지고 있는 값을 지정하는 행 표현식입니다.
- ( expression,expression... )
- 행 데이터 유형을 배열의 요소로 가지고 있는 값의 필드를 지정하는 둘 이상의 표현식 목록입니다. 각 표현식의 데이터 유형은 CREATE TYPE(행)문에 설명된 행 필드의 유효한 데이터 유형이어야 합니다(SQLSTATE 429C5).
- ORDER BY
- 일반 배열의 집계에서 처리되는 동일한 그룹화 세트로부터 행의 순서를 지정합니다.
ORDER BY 절이 컬럼 데이터의 순서를 구별할 수 없는 경우에는 동일 그룹화 세트의 행은
임의로 순서가 지정됩니다.
ORDER BY가 지정된 경우에는 일반 배열에서 집계된 요소의 순서를 결정합니다. ORDER BY가 지정되지 않고 다른 ARRAY_AGG, LISTAGG 또는 XMLAGG가 순서가 지정된 상태로 동일 SELECT 절에 포함되지 않은 경우에는 일반 배열 내에서 요소의 순서는 결정적이 아닙니다. ORDER BY가 지정되지 않고 동일한 SELECT 절에 순서를 지정하는 ARRAY_AGG, LISTAGG 또는 XMLAGG의 여러 어커런스가 있으면 ARRAY_AGG의 각 결과에 일반 배열 내의 동일한 요소 순서가 사용됩니다.
- sort-key
- 정렬 키는 컬럼 이름 또는 sort-key-expression일 수 있습니다. 정렬 키가 상수인 경우, 출력 컬럼의 위치를 참조하지 않고(쿼리의 일반 ORDER BY 절에서처럼) 단순히 정렬 키가 없음을 암시하는 상수입니다.
- ASC
- 오름차순으로 sort-key를 처리합니다. 이는 기본 옵션입니다.
- DESC
- 내림차순으로 sort-key를 처리합니다.
결과 데이터 유형은 일반 배열입니다. 요소 값이 단일 expression 또는 row-expression을 사용하여 지정된 경우에는, 배열 요소의 데이터 유형은 expression 또는 row-expression의 유형과 동일합니다. 요소 값이 표현식 목록으로 지정된 경우에는 배열 요소는 표현식에 해당하는 필드 유형이 있는 행 유형입니다.
SELECT절에는 ARRAY_AGG 함수가 포함되고 동일한 SELECT절의 모든 ARRAY_AGG, LISTAGG, XMLAGG 및 XMLGROUP 함수의 호출은 동일한 순서를 지정해야 하거나 순서를 지정하지 않아야 합니다(SQLSTATE 428GZ).
- 연관 배열 집계
-
- index-expression
- 연관 배열의 인덱스를 지정합니다. 동일 명령문에 대상 사용자 정의된 배열 데이터 유형이 있거나
ARRAY_AGG의 결과가 사용자 정의 배열 데이터 유형에 명시적으로 캐스트되는 컨텍스트에서 사용될 때에는
index-expression의 데이터 유형은 대상 연관 배열 데이터 유형의 인덱스
데이터 유형으로 캐스트 가능해야 합니다. 그렇지 않으면 index-expression의 데이터 유형은
CREATE TYPE(배열)문에서 연관 배열의 인덱스에 지정될 수 있는 데이터 유형이어야 합니다(SQLSTATE 429C2).
연관 배열을 집계하기 위해 처리되는 그룹화 세트에는 중복된 index-expression 값이 있을 수 없습니다(SQLSTATE 22545).
- element-expression
- 배열의 요소의 소스를 지정합니다.
- expression
- 배열의 요소 값을 지정하는 표현식입니다. 표현식의 데이터 유형은 CREATE TYPE(배열)문에 지정할 수 있는 데이터 유형입니다(SQLSTATE 429C2).
- row-expression
- 행 데이터 유형을 배열 요소로 가지고 있는 값을 지정하는 행 표현식입니다.
- ( expression,expression... )
- 행 데이터 유형을 배열의 요소로 가지고 있는 값의 필드를 지정하는 둘 이상의 표현식 목록입니다. 각 표현식의 데이터 유형은 CREATE TYPE(행)문에 설명된 행 필드의 유효한 데이터 유형이어야 합니다(SQLSTATE 429C5).
결과 데이터 유형은 연관 배열입니다. ARRAY_AGG가 동일 명령문에 대상 사용자 정의된 배열 데이터 유형이 있거나 ARRAY_AGG의 결과가 사용자 정의 배열 데이터 유형에 명시적으로 캐스트되는 컨텍스트에서 사용될 때에는 인덱스의 데이터 유형은 대상 연관 배열 데이터 유형과 일치합니다. 요소 값이 단일 expression 또는 row-expression을 사용하여 지정된 경우에는, 배열 요소의 데이터 유형은 expression 또는 row-expression의 유형과 동일합니다. 요소 값이 표현식 목록으로 지정된 경우에는 배열 요소는 표현식에 해당하는 필드 유형이 있는 행 유형입니다.
참고
- ARRAY_AGG 함수는 다음 특정 컨텍스트에서 SQL 프로시저, 컴파일된 SQL 함수 또는
복합 SQL(컴파일됨)문 내에만 지정될 수 있습니다(SQLSTATE 42887):
- SELECT INTO문의 select-list
- 스크롤 불가능한 커서의 정의에서 fullselect의 select-list
- SET문의 오른쪽에서 스칼라 서브쿼리의 select-list
- ARRAY_AGG는 OLAP 함수의 일부로 사용될 수 있습니다(SQLSTATE 42887).
- ARRAY_AGG를 사용하는 SELECT문은 ORDER BY 절 또는 DISTINCT 절을 포함할 수 없고, SELECT 절이나 HAVING 절은 서브쿼리를 포함하거나 서브쿼리를 리턴하는 인라인된 SQL 함수를 호출할 수 없습니다(SQLSTATE 42887).
예
- 예제 1: 다음 DDL이 제공됩니다.
SELECT INTO문을 사용하는 프로시저를 작성하여 직원에게 연락할 수 있는 연락처 번호의 우선순위가 있는 목록을 리턴합니다.CREATE TYPE PHONELIST AS DECIMAL(10, 0)ARRAY[10] CREATE TABLE EMPLOYEE ( ID INTEGER NOT NULL, PRIORITY INTEGER NOT NULL, PHONENUMBER DECIMAL(10, 0), PRIMARY KEY(ID, PRIORITY))
SET문을 사용하는 프로시저를 작성하여 직원의 연락처 번호 목록을 임의의 순서로 리턴합니다.CREATE PROCEDURE GETPHONENUMBERS (IN EMPID INTEGER, OUT NUMBERS PHONELIST) BEGIN SELECT ARRAY_AGG(PHONENUMBER ORDER BY PRIORITY) INTO NUMBERS FROM EMPLOYEE WHERE ID = EMPID; ENDCREATE PROCEDURE GETPHONENUMBERS (IN EMPID INTEGER, OUT NUMBERS PHONELIST) BEGIN SET NUMBERS = (SELECT ARRAY_AGG(PHONENUMBER) FROM EMPLOYEE WHERE ID = EMPID); END - 예제 2: SELECT INTO문을 사용하는 프로시저를 작성하여 우선순위 1 전화 번호를
EMPLOYEE 테이블로부터 ID순으로 인덱스되는 연관 배열로 집계합니다.
CREATE TYPE EMPPHONES AS DECIMAL(10,0) ARRAY[INTEGER] CREATE PROCEDURE GETPHONES (OUT EMPLOYEES EMPPHONES) BEGIN SELECT ARRAY_AGG(ID, PHONENUMBER) INTO EMPLOYEES FROM EMPLOYEE WHERE PRIORITY=1; END - 예제 3: SELECT INTO문을 사용하는 프로시저를 작성하여
EMPLOYEE 테이블을 행 변수의 배열로 집계합니다.
CREATE TYPE EMPROW AS ROW ANCHOR ROW EMPLOYEE CREATE TYPE EMPARRAY AS EMPROW ARRAY[] CREATE PROCEDURE GETEMPLOYEES (OUT EMPLOYEES EMPARRAY) BEGIN SELECT ARRAY_AGG((ID, PRIORITY, PHONENUMBER) ORDER BY ID) INTO EMPLOYEES FROM EMPLOYEE; END
