2014-10-29 144 views
7

有谁知道Firebird 2.5是否具有类似于SQL中“STUFF”函数的功能? 我有一个包含父级用户记录的表和另一个包含与父级相关的子用户记录的表。我希望能够拉取用户拥有的“角色”的逗号分隔字符串,而不必使用第二个查询,循环返回给定ID的值并自行创建字符串。Firebird 2.5 - 与SQL中的STUFF等效的函数(GROUP_CONCAT中的MySql/LISTAGG在Oracle中)

我已经查找过任何其他相关的问题,但还没有找到。 在这个链接string equivalent of Sum to concatenate的问题基本上是我想要做的,但与Firebird 2.5数据库。

回答

10

看起来你是幸运的 - 火鸟2.1具有LIST() aggregate function这在MySQL中,它允许查询,像这样的工作原理是GROUP_CONCAT

SELECT p.Name, LIST(c.Name, ', ') 
FROM parent p INNER JOIN child c on c.parentid = p.parentid 
GROUP by p.Name; 

编辑,重新订购

您可能在应用LIST聚合函数之前,可以通过预先排列派生表中的数据来影响排序,如下所示:

SELECT x.ParentName, LIST(x.ChildName, ', ') 
FROM 
(
    SELECT p.Name as ParentName, c.Name as ChildName 
    FROM parent p INNER JOIN child c on c.parentid = p.parentid 
    ORDER BY c.Name DESC 
) x 
GROUP by x.ParentName; 
+1

真棒!非常感谢StuartLC我不知道这个功能。完美地工作!只要它能让我接受正确的答案。 – Phil 2014-10-29 16:24:13

+0

订购过程如何?假设我按字母顺序需要父母和孩子的名字,如果我添加“ORDER BY p.Name,c.Name)我得到这个错误:”ORDER BY子句中的表达式无效(不包含在聚合函数中或GROUP BY子句)“由于c.Name存在于order by子句中,有没有办法解决这个问题? – Bozzy 2016-02-05 11:52:41

+1

@Bozzy你可以通过在派生表中进行有序的预投影来影响排序我已经更新了答案。 – StuartLC 2016-02-09 17:57:03

相关问题