Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Oracle > SQL: преобразовать список (из SELECT)


Автор: ivashkanet 4.4.2007, 17:32
Всем привет.

Есть набор строк, каждая состоит из одной колонки типа Строка.
Нужно получить одно результирующее значение, которое получается из этого набора склеиванием этих строк в одну и с разделителем запятая.

Скорее всего это будет что-то типа:
Код

select join(operator_clock_number, ',')
  from (select operator_clock_number from operators)


Заранее спасибо

Автор: LSD 4.4.2007, 17:37
Запросом такого не сделать. Тебе нужно написать процедуру на PL/SQL которая пробежиться по этому курсору и "склеит" все в одну строку.

Автор: ivashkanet 4.4.2007, 17:47
Жаль. :(
Мне нужно создать View, одна из колонок которой будет эта строка.


LSD, не поможешь мне с этим, а то я Оракл знаю всего месяц, а за PL/Sql даже не брался :(

Автор: Sqlninja 4.4.2007, 17:53
http://www.oracle.com/technology/oramag/code/tips2004/050304.html

Автор: DimW 5.4.2007, 07:33
Цитата(ivashkanet @  4.4.2007,  17:32 Найти цитируемый пост)
набор строк, каждая состоит из одной колонки


ivashkanet, где хранятся строки, в таблицах или тебе этот набор строк параметром приходит?

Автор: ivashkanet 5.4.2007, 09:01
DimW, я же написал пример, он максимально приближен к задаче smile
Эти строки хранятся в таблице smile
Sqlninja, я гляну, спасибо

Автор: DimW 5.4.2007, 09:52
создаешь функцию:

Код

create or replace function get_all_row return varchar2 is
  result varchar2(2000);
begin
  for i in (select operator_clock_number from operators)
  loop
    result := result ||','|| i.operator_clock_number;
  end loop;
  return(result);
end get_all_row;


выполняешь такой запрос:

Код

select t.operator_clock_number, get_all_row from operators t

если я все правельно понял это то что тебе нужно.
единственное ограничение в функции - "result varchar2(2000);"

на основе селекта создашь вьюху

Добавлено через 8 минут и 16 секунд
если вьюха должна возвращать одну строку то селект такой:

Код

select get_all_row from dual

Автор: ivashkanet 5.4.2007, 10:02
DimW, круто   smile  smile

А теперь можно добавить к этой функции пару параметров:
1) Department чтобы запрос был такой
Код
select operator_clock_number from operators where Department =department 

2) очень хотелось бы установить имя таблицы выборки "operators" и его поля "operator_clock_number" . 

2 не столь важно, а вот без п1 никак 
ИМХО, 1 элементарно, но я не знаком с синтаксисом Pl/SQL 

Заранее спасибо

Автор: DimW 5.4.2007, 10:08
Цитата

1) Department чтобы запрос был такой


Код

create or replace function get_all_row(pDep varchar2) return varchar2 is
  result varchar2(2000);
begin
  for i in (select operator_clock_number from operators where Department = pDep)
  loop
    result := result ||','|| i.operator_clock_number;
  end loop;
  return(result);
end get_all_row;



отсюда:

Код

select get_all_row('xxx') from dual



по поводу остального - пока втыкаю...

Автор: ivashkanet 5.4.2007, 10:11
DimW, большое спасибо

Автор: DimW 5.4.2007, 10:14
пожалуйста smile

Автор: DimW 5.4.2007, 10:51
по поводу:

Цитата(ivashkanet @  5.4.2007,  10:02 Найти цитируемый пост)
2) очень хотелось бы установить имя таблицы выборки "operators" и его поля "operator_clock_number" . 

Код

create or replace function get_all_rows_by_param(pTable_Name varchar2, pField_Name varchar2) return varchar2 is
  result varchar2(2000);
  sql_block varchar2(1000) := 'begin
                                 for i in (select ' || pField_Name || ' from ' || pTable_Name || ')
                                 loop
                                   :result := :result || '','' || i.' || pField_Name || ';
                                 end loop;
                               end;';
begin
  execute immediate sql_block using in out result;
  return(result);
end get_all_rows_by_param;

параметр для условия и условие добавишь сам если нужно.

отсюда:
Код

select get_all_rows_by_param('operators', 'operator_clock_number') from dual


Автор: ivashkanet 5.4.2007, 11:03
О как  smile smile 

Пасибо, буду разбираться  smile  smile  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)