Sql 从DB2中的查询创建一个定界字符串

Sql 从DB2中的查询创建一个定界字符串,sql,db2,ibm-midrange,Sql,Db2,Ibm Midrange,我试图从iSeries AS/400上DB2中的查询结果中创建一个定界字符串。我已经在T-SQL中完成了这项工作,但在这里找不到实现这项工作的方法 这是我的T-SQL代码。我正在寻找DB2中的等价项 DECLARE @a VARCHAR(1000) SELECT @a = COALESCE(@a + ', ' + [Description], [Description]) FROM AP.Checkbooks SELECT @a 如果我的表格中的描述如下所示: 描述1 描述2 描述3 然后它将

我试图从iSeries AS/400上DB2中的查询结果中创建一个定界字符串。我已经在T-SQL中完成了这项工作,但在这里找不到实现这项工作的方法

这是我的T-SQL代码。我正在寻找DB2中的等价项

DECLARE @a VARCHAR(1000)
SELECT @a = COALESCE(@a + ', ' + [Description], [Description])
FROM AP.Checkbooks
SELECT @a
如果我的表格中的描述如下所示:

描述1 描述2 描述3

然后它将返回以下内容:

描述1,描述2,描述3


实际上,您正在寻找与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

或者应该,如果我读的东西正确的话,我试图在OLEDB中这样做,据我所知,你不能这样做,因为你不能在SQL中为OLEDB做任何像声明变量或创建表这样的事情。所以我想没有办法。

您可以使用常见的表表达式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;

如果您运行的是DB29.7或更高版本,那么可以使用listag函数。请看这里:

在MySQL中,这将是“GROUP_CONCAT”。我不确定这是否是对我的答案的注释,但我的答案没有声明变量或创建表。可能是XMLAGG对您不可用。没错,我想我没有XMLAGG,因为它无法识别OLEDB查询中的任何内容。他可以使用数据库函数+1,附带注释:如果您在Z/OS v10上运行,那么将varchar1024更改为clob1024我已经寻找了很多年了。这正是我所需要的。谢谢。像这样的答案应该有+10按钮。