如何在SQL中将多行合并为单行?

6
如何使用SQL将多行连接成一行?我的数据库是DB2。
TableFoo
 -------
 Id      Name
 1       Apples
 1       Tomatoes
 1       Potatoes
 2       Banana
 2       Peach

我希望你能为我提供类似于以下内容的东西:

ID       FruitsAvailable
-------------------------
 1       Apples, Tomatoes, Potatoes

这取决于您使用的数据库管理系统。 - Daniel Hilgarth
@MahmoudGamal 我在使用DB2。 - Zo Has
帖子上的答案并不是我期待的。我想可能还有许多其他方法。 - Zo Has
1
@DanielHilgarth:GROUP_CONCAT在DB2中可用吗? - Andriy M
@AndriyM:你说得对,似乎不存在。 - Daniel Hilgarth
递归可以通过函数避免,但也许有其他方法可以不使用数据库函数。 - Zo Has
2个回答

7

试试这个

  SELECT id ,FruitsAvailable 
  FROM
      (SELECT id , group_concat(Name) as FruitsAvailable 
       FROM  TableFoo
       WHERE id = 1) t

这里是SQLFIDDLE演示

编辑: 在DB2中,您需要创建函数,然后调用它。

 CREATE FUNCTION MySchema/MyUDF (
PARCol2 CHAR(5) )
RETURNS VARCHAR(1024)   
LANGUAGE SQL 
NOT DETERMINISTIC 
READS SQL DATA 
CALLED ON NULL INPUT 
DISALLOW PARALLEL 

 BEGIN 
  DECLARE ReturnVal VARCHAR(1024) NOT NULL DEFAULT '';

  FOR CsrC1 AS C1 CURSOR 
      FOR SELECT MyCol1 
             FROM MyTable 
             WHERE MyCol2 = ParCol2 
      DO SET ReturnVal = ReturnVal Concat CsrC1.MyCol1; 
  END FOR; 

  RETURN LTRIM(ReturnVal); 
 END  ; 

然后在这里调用它

     Select  id, MyUDF(Name) as FruitsAvailable
     From TableFoo 
     where id = 1 

1
-1: GROUP_CONCAT是MySql中的函数,在DB2中并不存在。 - Daniel Hilgarth
无法使其正常工作。我认为DB2不支持group_concat。 - Zo Has
谢谢!使用游标是必要的吗? - Zo Has
我遇到了一个问题,这个函数无论我传入什么参数都会返回“++++++++++”,我尝试了很多修改但是还是这样。有人有什么想法吗? - Steven Rogers
@StevenRogers 是的...放弃DB2吧。我的公司正在这样做,而且现在是最好的时机。 - cbmeeks
1
@cbmeeks 这是客户的数据库。他们已经拒绝切换并像胶水一样坚持使用它。在我发表上一条评论几天后,我能够找到一个解决方法,但我希望记得它是什么,这样我就可以与世界分享了。 - Steven Rogers

-3
请使用以下查询:
SELECT Id, GROUP_CONCAT(Name SEPARATOR ', ') FROM TableFoo GROUP BY Id;

6
GROUP_CONCAT是MySQL中的函数,它在DB2中不存在。 - Daniel Hilgarth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接