Эквивалент функций PostgreSQL для array () / array_to_string () в Oracle 9i - PullRequest
8 голосов
/ 01 декабря 2010

Я надеюсь вернуть одну строку со списком значений, разделенных запятыми, из запроса, который возвращает несколько строк в Oracle, по существу сгладив возвращенные строки в одну строку.

В PostgreSQL это может быть достигнуто с помощью функций array и 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?

Спасибо

Мэтт

Ответы [ 2 ]

5 голосов
/ 01 декабря 2010

Тим Холл имеет исчерпывающую коллекцию методов агрегирования строк в Oracle .

Если вы застряли на 9i, я бы предпочел определить пользовательский агрегат (естьреализация string_agg на этой странице), чтобы у вас было

SELECT string_agg( name )
  FROM people

Но вам нужно определить новую функцию STRING_AGG.Если вам нужно избегать создания новых объектов, есть другие подходы, но в 9i они будут более сложными, чем синтаксис PostgreSQL.

1 голос
/ 01 декабря 2010

В 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 хорош, потому что он гибкий, но он может быть медленным, поэтому будьте осторожны с этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...