복붙노트

[SQL] DB2의 쿼리에서 구분 된 문자열을 만들기

SQL

DB2의 쿼리에서 구분 된 문자열을 만들기

저는는 iSeries (AS / 400)의 DB2에서 쿼리의 결과에서 구분 된 문자열을 만들려고하고 있습니다. 나는 T-SQL에서 이런 짓을했지만, 여기에 그것을 할 수있는 방법을 찾을 수 없습니다.

여기에 T-SQL 내 코드입니다. 나는 DB2에 equivelant을 찾고 있어요.

DECLARE @a VARCHAR(1000)
SELECT @a = COALESCE(@a + ', ' + [Description], [Description])
FROM AP.Checkbooks
SELECT @a

이처럼 내 테이블보기에서 설명하는 경우 :

그런 다음이를 반환합니다 :

해결법

  1. ==============================

    1.기본적으로 당신은 DB2에서의 MySQL의 GROUP_CONCAT 집계 함수에 해당 찾고 있습니다. 내가 찾은 하나 개의 스레드에 따르면, 당신은 XMLAGG 기능을 통해 이동하여이 동작을 모방 할 수 있습니다 :

    기본적으로 당신은 DB2에서의 MySQL의 GROUP_CONCAT 집계 함수에 해당 찾고 있습니다. 내가 찾은 하나 개의 스레드에 따르면, 당신은 XMLAGG 기능을 통해 이동하여이 동작을 모방 할 수 있습니다 :

    create table t1 (num int, color varchar(10));
    
    insert into t1 values (1,'red'), (1,'black'), (2,'red'), (2,'yellow'), (2,'green');
    
    select num,
      substr( xmlserialize( xmlagg( xmltext( concat( ', ', color ) ) ) as varchar( 1024 ) ), 3 )
      from t1
      group by num;
    

    이것은 반환

    1 red,black
    2 red,yellow,green
    

    (또는해야, 내가 제대로 일을 읽고 있어요 경우)

  2. ==============================

    2.당신은 공통 테이블 식 (CTE를) 및 재귀를 사용하여이 작업을 수행 할 수 있습니다.

    당신은 공통 테이블 식 (CTE를) 및 재귀를 사용하여이 작업을 수행 할 수 있습니다.

    with                                                                
        cte1 as                                                             
            (select description, row_number() over() as row_nbr from checkbooks),
    
        cte2 (list, cnt, cnt_max) AS                              
            (SELECT VARCHAR('', 32000), 0, count(description) FROM cte1
             UNION ALL                                                        
             SELECT 
                 -- No comma before the first description
                 case when cte2.list = '' THEN RTRIM(CHAR(cte1.description)) 
                      else cte2.list || ', ' || RTRIM(CHAR(cte1.description)) end,   
                      cte2.cnt + 1, 
                      cte2.cnt_max                                
             FROM   cte1,cte2                                                 
             WHERE  cte1.row_nbr = cte2.cnt + 1 AND cte2.cnt < cte2.cnt_max ),                             
    
        cte3 as                                                          
            (select list from cte2 
             where cte2.cnt = cte2.cnt_max fetch first 1 row only)
    
    select list from cte3;
    
  3. ==============================

    3.난 당신이 선언 변수와 같은 OLEDB에 대한 SQL 아무것도 공상을하거나 테이블을 만들 수 없기 때문에이 작업을 수행 할 수 없습니다 이해 내가는 OLEDB과에서이 작업을 수행하기 위해 노력하고있어. 내가 추측 그래서 방법이 없습니다.

    난 당신이 선언 변수와 같은 OLEDB에 대한 SQL 아무것도 공상을하거나 테이블을 만들 수 없기 때문에이 작업을 수행 할 수 없습니다 이해 내가는 OLEDB과에서이 작업을 수행하기 위해 노력하고있어. 내가 추측 그래서 방법이 없습니다.

  4. ==============================

    4.당신은 DB2 9.7 이상을 실행하는 경우 LISTAGG 기능을 사용할 수 있습니다. 여기 보라 : http://pic.dhe.ibm.com/infocenter/db2luw/v9r7/index.jsp?topic=%2Fcom.ibm.db2.luw.sql.ref.doc%2Fdoc%2Fr0058709.html

    당신은 DB2 9.7 이상을 실행하는 경우 LISTAGG 기능을 사용할 수 있습니다. 여기 보라 : http://pic.dhe.ibm.com/infocenter/db2luw/v9r7/index.jsp?topic=%2Fcom.ibm.db2.luw.sql.ref.doc%2Fdoc%2Fr0058709.html

  5. from https://stackoverflow.com/questions/3728010/create-a-delimitted-string-from-a-query-in-db2 by cc-by-sa and MIT license