我希望从Oracle中返回多行的查询返回一行逗号分隔的值列表,基本上将返回的行展平为一行。
在PostgreSQL中,这可以使用数组和array_to_string函数来实现,如下所示:
鉴于表“人”:
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中实现相同的结果?
谢谢,
马特
答案 0 :(得分:5)
如果您遇到9i,我的个人偏好是定义一个自定义聚合(该页面上有一个string_agg的实现),这样你就可以
SELECT string_agg( name )
FROM people
但是你必须定义一个新的STRING_AGG函数。如果你需要避免创建新对象,还有其他方法,但在9i中,它们将比PostgreSQL语法更加混乱。
答案 1 :(得分:1)
在10g中我绝对更喜欢Tim文章末尾提到的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很好,因为它很灵活,但速度很慢,所以要小心。