oracle listagg支持,PostgreSQL行列转换(兼容oracle listagg)

oracle11g开始支持的listagg函数替代了wmconcat来实现行列转换的功能。

listagg函数的用法:

0060da8b99377f3b10c0ff630c750a19.png

oracle行列转换例子:

—建表https://www.cndba.cn/foucus/article/3929https://www.cndba.cn/foucus/article/3929

SQL> create table b (id number,name varchar2(20));

Table created.

insert into b values(1,'zhang');

insert into b values(1,'wang');

insert into b values(2,'li');

insert into b values(2,'zhao');

SQL> select id,LISTAGG(name,',') within group(order by name desc) as bb from b group by id;

ID

----------

BB

--------------------------------------------------------------------------------

1

zhang,wang

2

zhao,li

pg中是没有listagg和wmconcat函数的,那么我们要怎么在pg中如何实现同样的功能呢?pg中的string_agg函数可以用来代替listagg,实现同样的功能。https://www.cndba.cn/foucus/article/3929

https://www.cndba.cn/foucus/article/3929

pg行列转换例子:

—建表https://www.cndba.cn/foucus/article/3929

bill=# create table tbl1 (gid int, val text, ts timestamp default clock_timestamp());

CREATE TABLE

—插入数据

bill=# insert into tbl1 values (1,'a'),(1,'b'),(1,null),(2,'test'),(2,'a""b"c'),(3,'fw');

INSERT 0 6

bill=# select * from tbl1;

gid | val | ts

-----+--------+----------------------------

1 | a | 2020-01-05 14:08:42.995435

1 | b | 2020-01-05 14:08:42.995636

1 | | 2020-01-05 14:08:42.995642

2 | test | 2020-01-05 14:08:42.995645

2 | a""b"c | 2020-01-05 14:08:42.995648

3 | fw | 2020-01-05 14:08:42.995717

(6 rows)

—行列转换

逆向聚合,双引号作为quote字符,转义文本内的双引号,空值使用NULL表示。

https://www.cndba.cn/foucus/article/3929

bill=# select gid, string_agg(coalesce('"'||replace(val,'"','/"')||'"','NULL'),',' order by ts desc) from tbl1 group by gid;

gid | string_agg

-----+--------------------

1 | NULL,"b","a"

2 | "a/"/"b/"c","test"

3 | "fw"

(3 rows)

正向聚合,双引号作为quote字符,转义文本内的双引号,空值使用NULL表示。

https://www.cndba.cn/foucus/article/3929

bill=# select gid, string_agg(coalesce('"'||replace(val,'"','/"')||'"','NULL'),',' order by ts) from tbl1 group by gid;

gid | string_agg

-----+--------------------

1 | "a","b",NULL

2 | "test","a/"/"b/"c"

3 | "fw"

(3 rows)

正向聚合,不使用QUOTE,直接去除NULL值https://www.cndba.cn/foucus/article/3929

bill=# select gid, string_agg(val,',' order by ts) from tbl1 group by gid;

gid | string_agg

-----+-------------

1 | a,b

2 | test,a""b"c

3 | fw

(3 rows)

版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值