一尘不染

与SQL中的STUFF等效的功能(MySSQL中的GROUP_CONCAT / Oracle中的LISTAGG)

sql

有谁知道Firebird 2.5是否具有类似于SQL中的“ STUFF”功能的功能?

我有一个表,其中包含父级用户记录,另一个表中包含与父级相关的子级用户记录。我希望能够拉出用户用逗号分隔的“
ROLES”字符串,而不必使用第二个查询,循环返回给定ID的值并自己创建字符串。

我已经搜索了其他任何相关问题,但没有找到任何相关问题。这个链接字符串中等效于Sum的问题基本上也是我想要做的,但是使用Firebird 2.5数据库。


阅读 260

收藏
2021-03-17

共1个答案

一尘不染

看起来您很幸运-Firebird
2.1引入了一个LIST()汇总函数,该函数的工作方式类似于GROUP_CONCATMySQL,它允许这样的查询:

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;
2021-03-17