在Oracle 9i中等同于PostgreSQL的array()/array_to_string()函数

10

我希望从Oracle查询中返回一行数据,该行数据包含多行返回结果的逗号分隔列表, 将多行结果"压平"为单行。

在PostgreSQL中可以通过使用array和array_to_string函数来实现:

假设有一个名为"people"的表:

id | name
---------
1  | bob
2  | alice
3  | jon

这个SQL查询语句:

select array_to_string(array(select name from people), ',') as names;

将返回:

names
-------------
bob,alice,jon

如何在Oracle 9i中实现相同的结果?

谢谢,

Matt


谢谢大家的帮助,我做了更多的研究,并发现这个答案对我很有用:https://dev59.com/WHRB5IYBdhLWcg3w6bYE#4027064 - walkermatt
2个回答

6

Tim Hall拥有Oracle中字符串聚合技术的权威收集。

如果您被困在9i上,我的个人偏好是定义一个自定义聚合(该页面上有string_agg的实现),这样您就会拥有:

SELECT string_agg( name )
  FROM people

但是你需要定义一个新的STRING_AGG函数。如果你需要避免创建新对象,还有其他方法,但在9i中,它们将比PostgreSQL语法更混乱。


+1 并感谢您提供的指引。霍尔先生的网站上有大量的内容! - DCookie

1

在10g中,我肯定更喜欢提姆文章末尾提到的COLLECT选项。

这种方法的好处是,可以使用相同的基础函数(接受集合作为参数),既作为聚合函数,又作为多重集函数:

SELECT deptno, tab_to_string(CAST(MULTISET(SELECT ename FROM emp 
WHERE deptno = dept.deptno) AS t_varchar2_tab), ',') FROM dept

然而在9i中这是不可用的。SYS_CONNECT_BY_PATH很好因为它很灵活,但它可能会很慢,所以要小心。


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