wmsys.wm_concat是oracle10g以后提供的一个链接函数,有个非常好的用法就是可以链接不同行的相同列,以实现行转列的功能。一般用法如下:
SQL> create table idtable (id number,name varchar2(30));
Table created
SQL> insert into idtable values(10,'ab');
1 row inserted
SQL> insert into idtable values(10,'bc');
1 row inserted
SQL> insert into idtable values(10,'cd');
1 row inserted
SQL> insert into idtable values(20,'hi');
1 row inserted
SQL> insert into idtable values(20,'ij');
1 row inserted
SQL> insert into idtable values(20,'mn');
1 row inserted
SQL> select * from idtable;
ID NAME
---------- ------------------------------
10 ab
10 bc
10 cd
20 hi
20 ij
20 mn
6 rows selected
SQL> select id,wmsys.wm_concat(name) name from idtable group by id;
ID NAME
---------- --------------------------------------------------------------------------------
10 ab,bc,cd
20 hi,ij,mn
但是有时候会成空值,上述例子,如果将name改动成name nvarchar2(30),就会变成空值,但不报错。
SQL> select id,wmsys.wm_concat(name) name from idtable group by id;
ID NAME
---------- --------------------------------------------------------------------------------
10
20
所以需要这样写:
SQL> select id,wmsys.wm_concat(to_char(name)) name from idtable group by id;
ID NAME
---------- --------------------------------------------------------------------------------
10 ab,bc,cd
20 hi,ij,mn