我正在尝试从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
答案 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