Oracle эквивалентен функции SQL Server STUFF? - PullRequest
6 голосов
/ 21 января 2010

Есть ли у Oracle собственная реализация функции SQL Server stuff?

Материал позволяет вам получить одно значение из выбора нескольких строк. Рассмотрим мою ситуацию ниже

 ID   HOUSE_REF   PERSON
 1      A         Dave
 2      A         John
 3      B         Bob

Я хотел бы написать оператор выбора, но я хочу, чтобы имена PERSON были в одной строке.

Например, когда я выбираю из этой таблицы, я хочу добиться следующего

HOUSE_REF   PERSONS
A           Dave, John
B           Bob

До сих пор я не смог найти простое решение, возможно, это был случай написания собственной функции для использования, но я не совсем уверен, как к этому подойти, какие-либо идеи?

Основным бизнес-использованием этого будет создание оператора select, который показывает каждый дом, а напротив этого дома - один столбец, в котором перечислены все, кто живет в этом доме. Ссылка на дом в этом выборе должна быть уникальной, поэтому необходимо объединить людей

Спасибо

Ответы [ 4 ]

7 голосов
/ 21 января 2010

Oracle 11.2 включает новую функцию LISTAGG для этого.

До этого вы могли использовать функцию STRAGG Тома Кайта .

2 голосов
/ 21 января 2010

Вы можете написать собственную функцию агрегирования, чтобы сделать это. Эта генерируемая строка ограничена 4k символами.

http://www.sqlsnippets.com/en/topic-11591.html

Существует недокументированная, неподдерживаемая функция WMSYS.WM_CONCAT, которая делает то же самое.

http://www.psoug.org/reference/undocumented.html

1 голос
/ 21 апреля 2011

Выполнить ниже трех функций.

Функция 1

создать или заменить тип stragg_type как объект (строка varchar2 (4000),

статическая функция ODCIAggregateInitialize (Sctx в выходной Stragg_type) возвращаемый номер,

функция-член ODCIAggregateIterate (само в вне stragg_type, значение в varchar2 ) номер возврата,

функция-член ODCIAggregateTerminate (self в stragg_type, вернуть значение из varchar2, флаги в количестве ) номер возврата,

функция-член ODCIAggregateMerge (само в вне stragg_type, ctx2 в stragg_type ) номер возврата);

/

функция 2

создать или заменить тело типа тип stragg_

статическая функция ODCIAggregateInitialize (sctx в out stragg_type) возвращаемый номер начать

sctx := stragg_type( null ) ;

return ODCIConst.Success ;

конец;

функция-член ODCIAggregateIterate (само в вне stragg_type, значение в varchar2) возвращаемое число начинается

self.string := self.string || ',' || value ;

return ODCIConst.Success;

конец;

функция-член ODCIAggregateTerminate (self
в stragg_type, вернуть значение из varchar2, количество флагов) возвращаемый номер начинается

returnValue := ltrim( self.string, ',' );

return ODCIConst.Success;

конец;

функция-член ODCIAggregateMerge
(само в вне stragg_type, ctx2 в stragg_type) возвращаемое число начинается с

self.string := self.string || ctx2.string;

return ODCIConst.Success;

конец;

конец; /

функция 3

создать или заменить функцию stragg ( ввод varchar2) возврат varchar2
детерминированный параллельный_отчетный
агрегирование с использованием stragg_type; /


после выполнения трех функций теперь вы можете использовать stragg следующим образом

Пример таблицы: emp name | зарплата
| 100 а | 200 а | 300 б | 400 б | 500 с | 600 с | 700 д
| 800

выберите имя, STRAGG (зарплата) как строка из группы emp по имени;

выход:

a | 100200300

б | 400500

с | 600700

д | 800

1 голос
/ 21 января 2010

Решение Oracle «без дополнений / без недокументированных функций» (до 11.2, как упоминает Тони):

select c1, ltrim(sys_connect_by_path(c2,','),',') persons
 from
  (
   select c1, c2, 
    row_number() over (partition by c1 order by c2 ) rn
     from
      (
       select house_ref c1, person c2 
        from housetable 
      )
   )
  where connect_by_isleaf=1
  connect by prior rn+1 =rn and prior c1 = c1
  start with rn=1
;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...