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

Откуда: Самара
Сообщений: 584
Когда уже на Oracle будет нормальная аггрегатная функция List , как в Sybase
16 май 19, 23:39    [21886703]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1379
Victor Cookin,

"Доку не читай, сразу на форум пости"(с)

Давно уже есть такая функция.
17 май 19, 05:54    [21886764]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1379
Victor Cookin,

либо указывайте конкретно - чем LIST в сайбесе лучше ораклового LISTAGGA-а и чего лично вам не хватает в LISTAGG-е
17 май 19, 05:55    [21886765]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 28975
Victor Cookin
Когда уже на Oracle будет нормальная аггрегатная функция List , как в Sybase
Шёл бы ты, бездарь, на откуда пришёл.
17 май 19, 07:35    [21886791]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
AmKad
Member

Откуда:
Сообщений: 4979
Справедливости ради стоит отметить, что приведенная топикстартером функция вражеской датабазы возвращает LONG VARCHAR, что несколько превышает максимальный размер возращаемого listagg ораколового varchar2.
Но, как все мы знаем, вышесказанное мною не отменяет возможности получить список элементов в строковом виде условно неограниченного размера средствами Oracle без PL/SQL и listagg.
17 май 19, 08:44    [21886815]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1840
Щукина Анна
и чего лично вам не хватает в LISTAGG-е


unique


ps
в новых версиях з WITHIN улучшили

если есть сортировка, то добавить уникальность не так уж и сложно
.....
stax
17 май 19, 08:56    [21886833]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
AserYZ
Member

Откуда: Dniepr (Ukraine)
Сообщений: 225
AmKad
Справедливости ради стоит отметить, что приведенная топикстартером функция вражеской датабазы возвращает LONG VARCHAR, что несколько превышает максимальный размер возращаемого listagg ораколового varchar2.
Но, как все мы знаем, вышесказанное мною не отменяет возможности получить список элементов в строковом виде условно неограниченного размера средствами Oracle без PL/SQL и listagg.


В соседней сходной ветке уже выяснили, что после 12 версии Ваш аргумент не аргумент и Оракл удлинил свой варчар2 до 32к что вполне хватает для разного вида рукожопства членов кружка CLOBофобии. Это конечно не 512 терабайт, но то ли ещё будет.
17 май 19, 09:34    [21886874]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
-2-
Member

Откуда:
Сообщений: 14650
AserYZ
Ваш аргумент не аргумент и Оракл удлинил свой варчар2 до 32к что вполне хватает для разного вида рукожопства членов кружка CLOBофобии.
Замена фобии на более другую фобию не есть аргумент против аргумента.
17 май 19, 09:49    [21886892]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
AmKad
Member

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

Отбросив вопрос о целесообразности склеивания строк в сторону, 32к - это больше, чем 4к, всего в 8 раз. До 512 терабайт еще сколько-то порядков, что не делает listagg аналогом функции list. О чем я, силу своей дотошности, не смог не заметить.
17 май 19, 09:57    [21886906]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
-2-
Member

Откуда:
Сообщений: 14650
Stax
Щукина Анна
и чего лично вам не хватает в LISTAGG-е
unique
unique формально нет в синтаксисе
LISTAGG( [ ALL ] [ DISTINCT ] measure_expr [, 'delimiter'] [listagg_overflow_clause] )
[ WITHIN GROUP ] (order_by_clause) [OVER query_partition_clause]
но оно работает:
select listagg(unique to_char(mod(level, 3)), ',') within group (order by null) v193
from dual
connect by level<=10;

V193   
-----
0,1,2

AmKad
О чем я, силу своей дотошности, не смог не заметить.
Тогда нужно было дотошнить до более полного сравнения:
- типы аргумента,
- размер результата,
- ограничения по сортировке,
- параметры overflow,
- over().
17 май 19, 10:25    [21886942]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
AmKad
Member

Откуда:
Сообщений: 4979
-2-
Тогда нужно было дотошнить до более полного сравнения:
Я сегодня скудно позавтракал, поэтому содержимого желудка хватило только на сравнение размеров результата. А про overflow вообще только что узнал.
17 май 19, 10:32    [21886954]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1840
-2-
Stax
пропущено...
unique
unique формально нет в синтаксисе
LISTAGG( [ ALL ] [ DISTINCT ] measure_expr [, 'delimiter'] [listagg_overflow_clause] )
[ WITHIN GROUP ] (order_by_clause) [OVER query_partition_clause]
но оно работает:
select listagg(unique to_char(mod(level, 3)), ',') within group (order by null) v193
from dual
connect by level<=10;

V193   
-----
0,1,2



мододцы (доку не успели поправить)


в Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production Version 18.3.0.0.0
еще не работает
select listagg(unique job, ',') within group (order by null)
from emp 
group by deptnoORA-30482: DISTINCT option not allowed for this function

ORA-30482: DISTINCT option not allowed for this function


ps
по диаграме сортировка обязательна но без нее работает
select listagg(job, ',') --within group (order by null)
from emp 
group by deptno

MANAGER,SALESMAN,SALESMAN,SALESMAN,SALESMAN,CLERK
PRESIDENT,MANAGER,CLERK
MANAGER,ANALYST,ANALYST,CLERK,CLERK


....
stax
17 май 19, 11:21    [21887033]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1840
AmKad
А про overflow вообще только что узнал.


добавіть, добавили
но реализовали неакуратно (мой админ бы не принял)

....
stax
17 май 19, 11:25    [21887040]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
mayton
Member

Откуда: loopback
Сообщений: 40751
Он хотел как в Лиспе.

(list x y z)
17 май 19, 17:29    [21887515]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
Victor Cookin
Member

Откуда: Самара
Сообщений: 584
Хочется вот этого:
select LIST(column_name)
from all_tab_columns
where table_name = 'ESTABLISHMENT'
order by column_id


вместо

select LISTAGG(column_name, ',') within group (order by column_id)
from all_tab_columns
where table_name = 'ESTABLISHMENT'


 within group 
убирать пробовал, но "ORA-02000: missing WITHIN keyword"
Oracle 12
17 май 19, 20:11    [21887607]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 17347
Victor Cookin
Хочется

Это от непонимания.
Включите в Ваш пример group by и попробуйте переосмыслить.
17 май 19, 20:23    [21887614]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
-2-
Member

Откуда:
Сообщений: 14650
Victor Cookin
Хочется вот этого:
select LIST(column_name)
from all_tab_columns
where table_name = 'ESTABLISHMENT'
order by column_id

И что в sybase выдаст этот запрос?
17 май 19, 20:45    [21887623]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 51527
в мсскл назвали string_agg
Все что-то своё выдумавыют
19 май 19, 11:34    [21888101]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 9468
andreymx
в мсскл назвали string_agg
Все что-то своё выдумавыют


Суть не в названии а в том что это функция агрегатная. Т.e. сначала агрегация (GROUP BY по умолчанию) и только потом ORDER BY. Посему ORDER BY в примере от Victor Cookin произведет сортировку одной строки т.к. неявная группировкa а при явной нибо вылетит с "not a GROUP BY expression" либо отсортирует уже сгруппированные строки (если поле в ORDER BY присутствует в GROUP BY). Но в любом случае этот ORDER BY не имеет ничего общего c ORDER BY при группировке указываемый в WITHIN GROUP. Другое дело ORACLE мог бы сделать кляузу WITHIN GROUP(ORDER BY 1) кляузой по умолчанию - куда меньше буковок если порядок не важен.

SY
19 май 19, 14:31    [21888183]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
-2-
Member

Откуда:
Сообщений: 14650
SY
ORACLE мог бы сделать кляузу WITHIN GROUP(ORDER BY 1) кляузой по умолчанию - куда меньше буковок если порядок не важен.
1 или не 1, но что-то по-умолчанию есть
select listagg(dummy) v193
from dual
connect by level<=5
group by mod(level, 2);

V193
----
XXX
XX
19 май 19, 17:46    [21888289]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 9468
-2-
1 или не 1, но что-то по-умолчанию есть


Ну значит внял Oracle просьбам трудящихся:

SQL> select  version
  2    from  v$instance
  3  /

VERSION
-----------------
12.2.0.1.0

SQL> select listagg(dummy) v193
  2  from dual
  3  connect by level<=5
  4  group by mod(level, 2);
select listagg(dummy) v193
                      *
ERROR at line 1:
ORA-02000: missing WITHIN keyword


SQL>


SY.
19 май 19, 18:02    [21888303]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1840
SY

Ну значит внял Oracle просьбам трудящихся:

SY.


в 18-ке кляуза WITHIN GROUP еще обязательна, но без нее ошибки уже не выдает
https://docs.oracle.com/en/database/oracle/oracle-database/18/sqlrf/LISTAGG.html#GUID-B6E50D8E-F467-425B-9436-F7F8BF38D466

.....
stax
20 май 19, 08:27    [21888527]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
Victor Cookin
Member

Откуда: Самара
Сообщений: 584
andrey_anonymous
Это от непонимания.
Включите в Ваш пример group by и попробуйте переосмыслить.

Во многих случаях нужно просто взять результат запроса и получить именно лист, т.е. одно значение. При этом сам запрос может быть, понятно, довольно сложным. И визуально усложнять его при ненадобности этого делать - это нехорошо.

Stax
в 18-ке кляуза WITHIN GROUP еще обязательна, но без нее ошибки уже не выдает

а где уже не обязательна?
20 май 19, 17:09    [21889048]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 17347
Victor Cookin
andrey_anonymous
Это от непонимания.
Включите в Ваш пример group by и попробуйте переосмыслить.

Во многих случаях нужно просто взять результат запроса и получить именно лист, т.е. одно значение. При этом сам запрос может быть, понятно, довольно сложным. И визуально усложнять его при ненадобности этого делать - это нехорошо.

Нехорошо путать теплое с мягким, а именно - сортировку итоговой выборки и сортировку внутри группы, итогом которой станет одна строка итоговой выборки.
20 май 19, 17:27    [21889066]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
Victor Cookin
Member

Откуда: Самара
Сообщений: 584
andrey_anonymous
Нехорошо путать теплое с мягким, а именно - сортировку итоговой выборки и сортировку внутри группы, итогом которой станет одна строка итоговой выборки.


Пожалуйста поподробнее. Где в моём примере группа и сортировка внутри группы? У меня есть сортировка исходного запроса и всё, а больше мне (в данном случае) ничего не надо. И зачем требует group by column_id , когда надо order by column_id?
20 май 19, 17:50    [21889088]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Oracle Ответить