Oracle SQL 将行聚合到带有条件的列 listagg 中

Yan*_*ann 2 sql oracle

我有以下 - 简化 - 表格布局:

  • 表块(id)
  • TABLE 内容(id、blockId、订单、数据、类型)

content.blockId是 的外键blocks.id。这个想法是,在内容表中,对于一个块,您有许多不同类型的内容条目。

我现在正在寻找一个查询,它可以为我提供基于 blockId 的聚合,其中 3 种不同类型的所有内容条目都连接起来并放入相应的列中。

我已经开始并找到了listagg运行良好的函数,我做了以下语句并在列中列出了所有内容条目:

SELECT listagg(c.data, ',') WITHIN GROUP (ORDER BY c.order) FROM content c WHERE c.blockId = 330;
Run Code Online (Sandbox Code Playgroud)

然而,现在连接的字符串data在一列中包含块的所有元素。我想实现的是根据类型将其放入单独的列中。例如下面的内容content是这样的:

  • 1, 1, 0, "content1", "片段"
  • 2, 1, 1, "content2", "BULK"
  • 3, 1, 3, "content4", "片段"
  • 4, 1, 2, "content3", "片段"

现在我想输出 2 列,一个是 FRAGMENT,一个是 BULK,其中 FRAGMENT 包含“content1;content3;content4”,BULK 包含“content2”

有没有一种有效的方法来实现这一目标?

Gor*_*off 5

您可以使用case

SELECT listagg(CASE WHEN content = 'FRAGMENT' THEN c.data END, ',') WITHIN GROUP (ORDER BY c.order) as fragments,
       listagg(CASE WHEN content = 'BULK' THEN c.data END, ',') WITHIN GROUP (ORDER BY c.order) as bulks
FROM content c
WHERE c.blockId = 330;
Run Code Online (Sandbox Code Playgroud)