oracle wm_concat 替换函数,wm_concat 函数在PG中替代

WM_CONCAT 经常使用到行转列上,早期的代码里这个函数用的会比较多,但是可惜在12c中,这个函数已经过期了:

所以,在后续的开发中,不要再使用这个函数。在MOS中,Oracle也不建议客户使用这个函数,该函数为系统内部使用:

那PG中有没有类似的函数呢?答案是肯定的:string_agg.

创建测试数据

create table t_concat (id int,name varchar(100),score int); # pg

create table t_concat (id number,name varchar2(100),score number); # Oracle

truncate table t_concat;

insert into t_concat values (1,'yuwen',90);

insert into t_concat values (1,'shuxue',85);

insert into t_concat values (1,'yingyu',70);

insert into t_concat values (1,'wuli',80);

insert into t_concat values (1,'huaxue',74);

insert into t_concat values (2,'yuwen',91);

insert into t_concat values (2,'shuxue',90);

insert into t_concat values (2,'yingyu',73);

insert into t_concat values (2,'wuli',78);

insert into t_concat values (2,'huaxue',74);

查询

# Oracle

select id,sum(score),wm_concat(name) from t_concat group by id order by id;

SQL> select id,sum(score),wm_concat(name) from t_concat group by id order by id;

ID SUM(SCORE) WM_CONCAT(NAME)

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

1 399 yuwen,huaxue,wuli,yingyu,shuxue

2 406 yuwen,huaxue,wuli,yingyu,shuxue

# pg

select id,sum(score),string_agg(name,',') from t_concat group by id order by id;

test=# select id,sum(score),string_agg(name,',') from t_concat group by id order by id;

id | sum | string_agg

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

1 | 399 | yuwen,shuxue,yingyu,wuli,huaxue

2 | 406 | yuwen,shuxue,yingyu,wuli,huaxue

(2 rows)

pg可以指定其中的分隔符:

test=# select id,sum(score),string_agg(name,'-') from t_concat group by id order by id;

id | sum | string_agg

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

1 | 399 | yuwen-shuxue-yingyu-wuli-huaxue

2 | 406 | yuwen-shuxue-yingyu-wuli-huaxue

(2 rows)

test=# select id,sum(score),string_agg(name,'||') from t_concat group by id order by id;

id | sum | string_agg

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

1 | 399 | yuwen||shuxue||yingyu||wuli||huaxue

2 | 406 | yuwen||shuxue||yingyu||wuli||huaxue

(2 rows)

test=#

在Oracle官方文档中,从11gr2开始,建议使用listagg代替wm_concat:

col names format a60;

select id,sum(score),listagg(name,'-') within group (order by score ) as "names"from t_concat group by id order by id;

SQL> SQL> select id,sum(score),listagg(name,'-') within group (order by score ) as "names"from t_concat group by id order by id;

ID SUM(SCORE) names

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

1 399 yingyu-huaxue-wuli-shuxue-yuwen

2 406 yingyu-huaxue-wuli-shuxue-yuwen

SQL>

select id,sum(score),listagg(name) within group (order by name ) as "names"from t_concat group by id order by id;

ID SUM(SCORE) names

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

1 399 huaxueshuxuewuliyingyuyuwen

2 406 huaxueshuxuewuliyingyuyuwen

SQL>

分隔符不是必选参数。PG的string_agg的分隔符为必选参数:

test=# select id,sum(score),string_agg(name) from t_concat group by id order by id;

ERROR: function string_agg(character varying) does not exist

LINE 1: select id,sum(score),string_agg(name) from t_concat group by...

^

HINT: No function matches the given name and argument types. You might need to add explicit type casts.

test=#

参考链接:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Oraclewm_concat函数已经被弃用,可以使用LISTAGG函数来替代。LISTAGG函数可以将多行数据合并成一个字符串,并且可以指定分隔符。例如: SELECT deptno, LISTAGG(ename, ',') WITHIN GROUP (ORDER BY ename) AS employees FROM emp GROUP BY deptno; 这个查询将会按照部门号分组,将每个部门的员工姓名用逗号分隔合并成一个字符串。 ### 回答2: Oracle WM_CONCAT 函数是一种非常常用的函数,用于将多行数据转换为单行字符串。然而,自从 Oracle 11g 版本以后,Oracle 官方已经不再推荐使用 WM_CONCAT 函数了,原因是因为它只是一个内部函数,没有正式的文档和支持。因此,使用 WM_CONCAT 函数存在一些风险和不稳定性。此外,WM_CONCAT 函数Oracle SQL 的升级版本也可能随时被取消。 为了替代 Oracle WM_CONCAT 函数,我们可以考虑使用以下两种方法: 1. 使用LISTAGG 函数 Oracle 11g 开始,推出了一个新的字符串聚合函数 - LISTAGG。其语法为: LISTAGG ( expression [, delimiter ] ) WITHIN GROUP (ORDER BY order_column) [OVER (query_partition_clause)] 这个函数允许我们将一列数据的值连接成一个字符串,同时可以指定分隔符和排序方式。这种方式不仅比 WM_CONCAT 更加灵活,而且不受限于只能用于某些特定的表和列。 2. 使用XMLAGG 函数Oracle ,我们还可以使用 XMLAGG 函数来实现多行转单行。XMLAGG 将多个行聚合为一个单一的 XML 文档,然后使用 XMLElement 和 XMLSerialize 函数提取所需数据。它的语法如下: XMLAGG (XMLELEMENT (e, expression) ORDER BY order_column) 这种方法可能比 LISTAGG 更加灵活,XML 文档也可以自定义输出,而且兼容版本更广,但它也可能需要更高的计算成本和更大的存储空间。 综上所述,虽然 Oracle WM_CONCAT 函数在以前非常常用,但是它在当前Oracle SQL 操作并不安全,使用的时候需要注意潜在的风险。而使用 LISTAGG 或 XMLAGG 则更加灵活且具有更强的兼容性,它们是我们更好的替代选择。 ### 回答3: Oracle函数wm_concat()是用于将一个列的多个值合并成一个字符串的函数。这个函数Oracle 11g版本后已经不再被支持,因此需要使用新的替代函数。 有两种常见的wm_concat替代函数:LISTAGG()和STRING_AGG()函数。 LISTAGG(): LISTAGG()函数是从Oracle 11g版本开始支持的聚合函数,它可以将一个列的多个值合并成一个字符串,使用逗号分隔。这个函数的语法如下: LISTAGG(column, delimiter) WITHIN GROUP (ORDER BY column ASC/DESC) 其,column表示要合并的列,delimiter表示用于分隔每个值的分隔符。ORDER BY子句可以用于按升序或降序排序合并的结果。WITHIN GROUP子句可以使得函数在合并前按照特定条件排序,否则可能会出现不可预测的结果。 例如,下面的例子使用LISTAGG()函数将一个table_students表每个学生的课程合并为一个字符串: SELECT student_name, LISTAGG(course,',') WITHIN GROUP (ORDER BY course ASC) AS courses FROM table_students GROUP BY student_name; 以上代码将会返回以下结果: STUDENT_NAME | COURSES ------------|--------------------- John | English,Math,Science Mary | English,History,Science Tom | Math,Science STRING_AGG(): STRING_AGG()函数是SQL Server 2017版本开始支持的字符串聚合函数,可以将一个列的多个值合并成一个字符串,使用指定的分隔符。和LISTAGG()类似,STRING_AGG()函数的语法也很简单,如下所示: STRING_AGG(column, delimiter) 其,column表示要合并的列,delimiter表示用于分隔每个值的分隔符。 例如,下面的例子使用STRING_AGG()函数将一个table_students表每个学生的课程合并为一个字符串: SELECT student_name, STRING_AGG(course,',') AS courses FROM table_students GROUP BY student_name; 以上代码将会返回以下结果: STUDENT_NAME | COURSES ------------|--------------------- John | English,Math,Science Mary | English,History,Science Tom | Math,Science 通过使用新的替代函数,可以在Oracle或SQL Server数据库将一个列的多个值合并为一个字符串,而不需要使用不再支持的wm_concat()函数

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值