从DB2中的查询创建分隔字符串

时间:2010-09-16 15:07:35

标签: sql db2 ibm-midrange

我正在尝试从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   描述2
  说明3

然后它会返回:

  

描述1,描述2,描述3

4 个答案:

答案 0 :(得分:33)

基本上,您正在寻找DB2中MySQL的GROUP_CONCAT聚合函数的等价物。根据{{​​3}},您可以通过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

(或者,如果我正确地阅读了这些内容)

答案 1 :(得分:1)

您可以使用公用表表达式(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;

答案 2 :(得分:0)

我正在尝试在OLEDB中执行此操作,并且根据我的理解,您无法执行此操作,因为您无法在SQL中为OLEDB执行任何奇特的操作,例如声明变量或创建表。所以我猜没有办法。

答案 3 :(得分:0)

如果您运行的是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