wm_concat函数报错,用什么替换?

Oracle的wm_concat函数是就是把几行的字段放到一行(所谓的行列转换)里面。废话不多说,看下面的我在网上找到的SQL

首先让我们来看看这个神奇的函数wm_concat(列名),该函数可以把列值以","号分隔起来,并显示成一行,接下来上例子,看看这个神奇的函数如何应用
准备测试数据
SQL> create table test(id number,name varchar2(20));
SQL> insert into test values(1,'a');
SQL> insert into test values(1,'b');
SQL> insert into test values(1,'c');
SQL> insert into test values(2,'d');
SQL> insert into test values(2,'e');
SQL> commit;
效果1 : 行转列
SQL> select wm_concat(name) from test;
WM_CONCAT(NAME)
-------------------------------------------------------------------------
a,b,c,d,e
效果2: 把结果里的逗号替换成"|"
SQL> select replace(wm_concat(name),',','|') from test;
REPLACE(WM_CONCAT(NAME),',','|')
-----------------------------------------------------------------------
a|b|c|d|e
效果3:按ID分组合并name
SQL> select id,wm_concat(name) name from test group by id;
ID NAME
---------- ------------------------------
1 a,b,c
2 d,e
懒人扩展用法:
案例:我要写一个视图,类似"create or replace view as select 字段1,...字段50 from tablename" ,基表有50多个字段,要是靠手工写太麻烦了,有没有什么简便的方法? 当然有了,看我如果应用wm_concat来让这个需求变简单
SQL> select 'create or replace view as select '|| wm_concat(column_name) || ' from dept'from user_tab_columns where table_name='DEPT';
'CREATEORREPLACEVIEWASSELECT'||WM_CONCAT(COLUMN_NAME)||'FROMDEPT'
--------------------------------------------------------------------------------
create or replace view as select DEPTNO,DNAME,LOC from dept

近日,由于业务需求更改,我们的oracle数据库版本由11g升级到了12c,问题来了wm_concat函数在12c的版本中会报错,也就是没用了。在oracle_12c中用listagg函数可以实现同样的效果。代码如下

效果1 : 行转列
SQL> select wm_concat(name) from test;     oracle11g版本的

SQL> select listagg(t.name,'') within group(order by t.name) from test t;  oracle12版本




记录一下工作中遇到的问题 如下:
(SELECT listagg(x.riskname, ',') within group(order by x.riskname)
  FROM (SELECT (SELECT z.riskshortname
                  FROM lmrisk z
                 WHERE z.riskcode = b.riskcode) riskname,
               b.contno contno
          FROM lcpol b) x
 WHERE x.contno = a.contno) as 险种名称
 语句要出查询的是一个投保人买的这个保单中所有险种名称。因为每个险种都是一行数据。所以要用到行转列

 select listagg(t.name,'') within group(order by t.name) from test t where ...;这样实现的效果就是以逗号隔开了

猜你喜欢

转载自blog.csdn.net/AntdonYu/article/details/84987679