瀚高数据库实现oracle listagg() ... within group(order by )

Posted 瀚高PG实验室

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了瀚高数据库实现oracle listagg() ... within group(order by )相关的知识,希望对你有一定的参考价值。

目录
环境
文档用途
详细信息

环境
系统平台:Microsoft Windows (64-bit) 10
版本:5.6.4
文档用途
本文介绍oracle listagg() … within group(order by )在瀚高数据库中的实现,此版本的数据库已经兼容了listagg()用法,以下详解。

详细信息
一、oracle中例子:

create table orcl_listagg_ivan (la_id number,la_name varchar2(50),la_num number);
insert into orcl_listagg_ivan(la_id, la_name,la_num)values(1, ‘瀚高济南1’,1);

insert into orcl_listagg_ivan(la_id, la_name,la_num)values(1, ‘瀚高1’,2);

insert into orcl_listagg_ivan(la_id, la_name,la_num)values(1, ‘瀚高青岛1’,3);

insert into orcl_listagg_ivan(la_id, la_name,la_num)values(2, ‘瀚高成都2’,6);

insert into orcl_listagg_ivan(la_id, la_name,la_num)values(2, ‘瀚高青岛2’,5);

insert into orcl_listagg_ivan(la_id, la_name,la_num)values(2, ‘瀚高济南2’,4);

insert into orcl_listagg_ivan(la_id, la_name,la_num)values(2, ‘瀚高2’,7);

commit;

SQL> select * from orcl_listagg_ivan;

 LA_ID LA_NAME                                                LA_NUM

     1 瀚高济南1                                                   1

     1 瀚高1                                                      2

     1 瀚高青岛1                                                   3

     2 瀚高成都2                                                   6

     2 瀚高青岛2                                                   5

     2 瀚高济南2                                                   4

     2 瀚高2                                                      7

已选择7行。

SQL> select la_id,LISTAGG(la_name,’,’) within group(order by la_num desc) from orcl_listagg_ivan group by la_id;

 LA_ID  LISTAGG(LA_NAME,',')WITHINGROUP(ORDERBYLA_NUMDESC)

1 瀚高青岛1,瀚高1,瀚高济南1

2 瀚高2,瀚高成都2,瀚高青岛2,瀚高济南2

二、瀚高数据库例子:

create table hgdb_listagg_ivan (la_id number,la_name varchar2(50),la_num number);
insert into hgdb_listagg_ivan(la_id, la_name,la_num)values(1, ‘瀚高济南1’,1);

insert into hgdb_listagg_ivan(la_id, la_name,la_num)values(1, ‘瀚高1’,2);

insert into hgdb_listagg_ivan(la_id, la_name,la_num)values(1, ‘瀚高青岛1’,3);

insert into hgdb_listagg_ivan(la_id, la_num)values(1, 8);

insert into hgdb_listagg_ivan(la_id, la_name,la_num)values(1, ‘瀚高"4007088006"瀚高’,9);

insert into hgdb_listagg_ivan(la_id, la_name,la_num)values(2, ‘瀚高成都2’,6);

insert into hgdb_listagg_ivan(la_id, la_name,la_num)values(2, ‘瀚高青岛2’,5);

insert into hgdb_listagg_ivan(la_id, la_name,la_num)values(2, ‘瀚高济南2’,4);

insert into hgdb_listagg_ivan(la_id, la_name,la_num)values(2, ‘瀚高2’,7);

1)双引号作为quote字符,转义文本内的双引号,空值使用NULL表示

highgo=# select la_id, string_agg(coalesce(’"’||replace(la_name,’"’,’"’)||’"’,‘NULL’),’,’ order by la_num desc)

from hgdb_listagg_ivan group by la_id;

la_id | string_agg

-------±--------------------------------------------------------------

 1 | NULL,"瀚高青岛1","瀚高\\"4007088006\\"瀚高","瀚高1","瀚高济南1"

 2 | "瀚高2","瀚高成都2","瀚高青岛2","瀚高济南2"

(2 行记录)

2)不使用QUOTE,直接去除NULL值

highgo=# select la_id,string_agg(la_name,’,’ order by la_num desc) from hgdb_listagg_ivan group by la_id;

la_id | string_agg

-------±-----------------------------------------------

 1 | 瀚高青岛1,瀚高"4007088006"瀚高,瀚高1,瀚高济南1

 2 | 瀚高2,瀚高成都2,瀚高青岛2,瀚高济南2

(2 行记录)

3)只使用listagg()

highgo=# select la_id,listagg(la_name,’,’) from hgdb_listagg_ivan group by la_id;

la_id | listagg

-------±-----------------------------------------------

 1 | 瀚高济南1,瀚高1,瀚高青岛1,瀚高"4007088006"瀚高

 2 | 瀚高成都2,瀚高青岛2,瀚高济南2,瀚高2

(2 行记录)

highgo=# select la_id,listagg(la_name) from hgdb_listagg_ivan group by la_id;

la_id | listagg

-------±--------------------------------------------

 1 | 瀚高济南1瀚高1瀚高青岛1瀚高"4007088006"瀚高

 2 | 瀚高成都2瀚高青岛2瀚高济南2瀚高2

(2 行记录)

因此,如果只是使用了listagg的话是不需要修改的。

更多详细信息请登录【瀚高技术支持平台】查看https://support.highgo.com/#/index/docContent/104fd529047542fe

以上是关于瀚高数据库实现oracle listagg() ... within group(order by )的主要内容,如果未能解决你的问题,请参考以下文章

oracle listagg的 截取长度限制有没有啥方法解决

Oracle函数之LISTAGG

oracle函数listagg的使用说明

oracle行转列,列转行函数的使用(listagg,xmlagg)

Oracle SQL:如何删除 listagg 中的重复项

用listagg怎么替代这个写法