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이 제공됩니다.
     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))
    SELECT INTO문을 사용하는 프로시저를 작성하여 직원에게 연락할 수 있는 연락처 번호의 우선순위가 있는 목록을 리턴합니다.
     CREATE PROCEDURE GETPHONENUMBERS
       (IN  EMPID   INTEGER,
        OUT NUMBERS PHONELIST)
     BEGIN
       SELECT ARRAY_AGG(PHONENUMBER ORDER BY PRIORITY)
         INTO NUMBERS
       FROM EMPLOYEE
       WHERE ID = EMPID;
     END
    SET문을 사용하는 프로시저를 작성하여 직원의 연락처 번호 목록을 임의의 순서로 리턴합니다.
    CREATE 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