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