Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 возможно ли результат select-а представить в виде строки?  [new]
karapetyan_a
Member

Откуда: Yerevan, Armenia
Сообщений: 463
Гуру, подскажите реально ли при выборе одной колонки таблицы представить ее в виде строки с каким-нибудь разделителем? к примеру
select id from myTable
Result:
1
2
3
чтоб возвратило одну ячейку в виде "1, 2, 3"?

"додумался" до этой мысли при выборке из 2х таблиц - родитель-потомок, мне нужно для каждого родителя иметь список ID, ребенка.
вот и хочется одним запросом взять все данные
к примеру так:
select id, name, (select id from my_child_table where parent_id = pt.id) as child_id_list form my_parent_table pt

С уважением. Ашот.
22 фев 11, 13:27    [10273352]     Ответить | Цитировать Сообщить модератору
 Re: возможно ли результат select-а представить в виде строки?  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2170
karapetyan_a,

select wm_concat(level) from dual connect by level < 4

:)
22 фев 11, 13:29    [10273367]     Ответить | Цитировать Сообщить модератору
 Re: возможно ли результат select-а представить в виде строки?  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2170
но это неэротичный вариант
22 фев 11, 13:31    [10273378]     Ответить | Цитировать Сообщить модератору
 Re: возможно ли результат select-а представить в виде строки?  [new]
AmKad
Member

Откуда:
Сообщений: 5222
karapetyan_a,

Версия?
22 фев 11, 13:31    [10273383]     Ответить | Цитировать Сообщить модератору
 Re: возможно ли результат select-а представить в виде строки?  [new]
karapetyan_a
Member

Откуда: Yerevan, Armenia
Сообщений: 463
AmKad,

10g
22 фев 11, 13:35    [10273416]     Ответить | Цитировать Сообщить модератору
 Re: возможно ли результат select-а представить в виде строки?  [new]
karapetyan_a
Member

Откуда: Yerevan, Armenia
Сообщений: 463
--Eugene--,

Огромное спасибо, работает, хотя не понял почему "неэротично"............. можно красивее?
22 фев 11, 13:36    [10273425]     Ответить | Цитировать Сообщить модератору
 Re: возможно ли результат select-а представить в виде строки?  [new]
bdsm_sql
Member

Откуда:
Сообщений: 948
karapetyan_a
--Eugene--,

Огромное спасибо, работает, хотя не понял почему "неэротично"............. можно красивее?

1. недокументиарованно
2. нельзя задать порядок эл-тов
22 фев 11, 13:38    [10273445]     Ответить | Цитировать Сообщить модератору
 Re: возможно ли результат select-а представить в виде строки?  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2170
karapetyan_a
почему "неэротично"
wm_concat (buffer too small error)
22 фев 11, 13:39    [10273456]     Ответить | Цитировать Сообщить модератору
 Re: возможно ли результат select-а представить в виде строки?  [new]
karapetyan_a
Member

Откуда: Yerevan, Armenia
Сообщений: 463
--Eugene--
karapetyan_a
почему "неэротично"
wm_concat (buffer too small error)

Понятно......... тогда какой вариант "эротичный" ?
22 фев 11, 13:41    [10273476]     Ответить | Цитировать Сообщить модератору
 Re: возможно ли результат select-а представить в виде строки?  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2170
karapetyan_a,

написать свою функцию
22 фев 11, 13:42    [10273483]     Ответить | Цитировать Сообщить модератору
 Re: возможно ли результат select-а представить в виде строки?  [new]
karapetyan_a
Member

Откуда: Yerevan, Armenia
Сообщений: 463
--Eugene--
karapetyan_a,

написать свою функцию


Ну этот вариант всегда есть.... :)
22 фев 11, 13:47    [10273533]     Ответить | Цитировать Сообщить модератору
 Re: возможно ли результат select-а представить в виде строки?  [new]
AlexFF__|
Member

Откуда:
Сообщений: 2854
karapetyan_a,

xmlagg
22 фев 11, 14:02    [10273678]     Ответить | Цитировать Сообщить модератору
 Re: возможно ли результат select-а представить в виде строки?  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2170
karapetyan_a
можно красивее?
вот так будет чуть более эротично:
select xmlagg(xmlelement(a, level || ',') order by level).extract('A/text()').getclobval()
from dual connect by level < 4000
хотя, тоже несовсем
22 фев 11, 14:03    [10273690]     Ответить | Цитировать Сообщить модератору
 Re: возможно ли результат select-а представить в виде строки?  [new]
karapetyan_a
Member

Откуда: Yerevan, Armenia
Сообщений: 463
--Eugene--
karapetyan_a
можно красивее?
вот так будет чуть более эротично:
select xmlagg(xmlelement(a, level || ',') order by level).extract('A/text()').getclobval()
from dual connect by level < 4000
хотя, тоже несовсем


Видимо так и сделаю, а то "недокументированность" wm_concat страшно напугала нашего дб админа :)

Спасибо.
22 фев 11, 14:17    [10273847]     Ответить | Цитировать Сообщить модератору
 Re: возможно ли результат select-а представить в виде строки?  [new]
-2-
Member

Откуда:
Сообщений: 15330
with t as (
   select 'x' a from dual union all select 'y' from dual
)
select xmlcast(xmltype(cursor(select case when rownum>1 then ',' end||a from t)) as varchar2(20)) "11.2"
from dual;

11.2                 
-------------------- 
x,y                  
Для 10-ки, если не писать свой агрегат, более эффективным может оказаться model.
22 фев 11, 14:19    [10273871]     Ответить | Цитировать Сообщить модератору
 Re: возможно ли результат select-а представить в виде строки?  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2170
-2-
более эффективным может оказаться model.
я как глянул в эти дебри... так больше и не заглядывал
22 фев 11, 14:22    [10273894]     Ответить | Цитировать Сообщить модератору
 Re: возможно ли результат select-а представить в виде строки?  [new]
-2-
Member

Откуда:
Сообщений: 15330
--Eugene--
я как глянул в эти дебри... так больше и не заглядывал
model проще, чем sql. просто голова должна быть кубической.

Соединение строк в одну ячейку через разделитель
22 фев 11, 14:27    [10273931]     Ответить | Цитировать Сообщить модератору
 Re: возможно ли результат select-а представить в виде строки?  [new]
vircul
Member

Откуда:
Сообщений: 27
Интересно, почему оракл позволяется использовать сортировку в агрегационной функции xmlagg:
select xmlagg(xmlelement(a, level || ',') order by level).extract('A/text()').getclobval()
from dual

Но в то же время указание ORDER BY в самописной агрегационной функции запрещено?

По всем признакам xmlagg - типичная пользовательская функции на основе объектного типа и использования ODCI (разврапил ее и тип).
22 фев 11, 14:53    [10274171]     Ответить | Цитировать Сообщить модератору
 Re: возможно ли результат select-а представить в виде строки?  [new]
Clipsya
Member

Откуда: Moscow
Сообщений: 83
WITH t1 AS 
(
  SELECT 'String1' str FROM dual UNION ALL
  SELECT 'String2' str FROM dual UNION ALL
  SELECT 'String3' str FROM dual UNION ALL
  SELECT 'String4' str FROM dual
), t2 AS 
(
  SELECT str, row_number() OVER (ORDER BY str) n FROM t1
)
SELECT ltrim(sys_connect_by_path(str, ', '), ', ') FROM t2
WHERE LEVEL=(SELECT MAX(n) FROM t2)
CONNECT BY PRIOR n+1=n START WITH n=1


Возможные грабли - если в значении поля содержится разделитель
22 фев 11, 15:06    [10274273]     Ответить | Цитировать Сообщить модератору
 Re: возможно ли результат select-а представить в виде строки?  [new]
-2-
Member

Откуда:
Сообщений: 15330
vircul
По всем признакам xmlagg - типичная пользовательская функции
по всем "признакам" LEVEL типичная функция в sys.standard, однако ж...
никто не запрещает использовать order by внутри пользовательского агрегата.
22 фев 11, 15:44    [10274546]     Ответить | Цитировать Сообщить модератору
 Re: возможно ли результат select-а представить в виде строки?  [new]
bdsm_sql
Member

Откуда:
Сообщений: 948
-2-
with t as (
   select 'x' a from dual union all select 'y' from dual
)
select xmlcast(xmltype(cursor(select case when rownum>1 then ',' end||a from t)) as varchar2(20)) "11.2"
from dual;

11.2                 
-------------------- 
x,y                  
Для 10-ки, если не писать свой агрегат, более эффективным может оказаться model.

может я чего не понял, но зачем этот изврат, если для 11.2 есть LISTAGG
22 фев 11, 16:08    [10274731]     Ответить | Цитировать Сообщить модератору
 Re: возможно ли результат select-а представить в виде строки?  [new]
karapetyan_a
Member

Откуда: Yerevan, Armenia
Сообщений: 463
Чуток отклонюсь от темы.
Пишу на .NET клиентское приложение
Заполняю из базы список "родительских" объектов (500 шт.)
каждый родитель имеет в дочерней таблице максимум 5 записей (естественно возможно и больше, но данные будут в разумных пределах)
Родительский объект имеет коллекцию id дочерних записей.
С первого взгляда вариантов заполнения 2
1. Загнать всех родителей в список, далее для каждого родителя гонять запрос к базе получая дочерние id.
2. загнать всех родителей в список, загнать всех детей в другой временный список, далее LINQ/foreach для заполнения id-шек детей у родителя.

Вот тут я вроде хотел "соптимизировать", получить одним селектом и родителей и в одной колонке id-шки детей, потом сплитнуть строку в массив и все (отсюда и пост на форуме)

Вот по сему поводу и разгорелся у нас в коллективе спор...... правильно так делать или лучше варианты 1/2?

Народ, кто как бы поступил, и почему?
22 фев 11, 17:37    [10275364]     Ответить | Цитировать Сообщить модератору
 Re: возможно ли результат select-а представить в виде строки?  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2170
karapetyan_a,

имхо, плохой вариант пихать айдишники в строку
22 фев 11, 17:55    [10275472]     Ответить | Цитировать Сообщить модератору
 Re: возможно ли результат select-а представить в виде строки?  [new]
-2-
Member

Откуда:
Сообщений: 15330
karapetyan_a
получить одним селектом и родителей и в одной колонке id-шки детей, потом сплитнуть строку в массив
cursor/collect/multiset
22 фев 11, 18:04    [10275522]     Ответить | Цитировать Сообщить модератору
 Re: возможно ли результат select-а представить в виде строки?  [new]
karapetyan_a
Member

Откуда: Yerevan, Armenia
Сообщений: 463
-2-
karapetyan_a
получить одним селектом и родителей и в одной колонке id-шки детей, потом сплитнуть строку в массив
cursor/collect/multiset


cursor/collect/multise...в смысле?
как в mssql-е получать одним запросом несколько результатов(рекордсетов)?
23 фев 11, 12:06    [10277835]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить