今天在工作中遇到一个需求,需要把SQL语句的查询结果的列转成一行,请教同事后得知可以使用wm_concat()这个函数,现记录在此。
wm_concat()用于将列转为行,列数据之间用逗号隔开,注意其得到的结果类型为CLOB,可以通过to_char()函数转换成varchar2。由于在公司外网没办法连数据库,所以下面的例子纯手打,并非是数据库显示的结果。
假设有oracle中有如下表t_example_employee,内容如下
select * from t_example_employee;
---------------------------------------------------
id name age
1 lili 27
2 lucy 26
3 tom 27
4 jim 26
----------------------------------------------------
需要得到年龄为27的员工所有员工,并做为一行返回,可以使用
select to_char(wm_concat(name)) names from t_example_employee where age=27;
---------------------------------------------------
NAMES
lili,tom
---------------------------------------------------
而如果我们不想使用默认的“,”分隔,可以通过replace()函数来实现,比如需要将上面的名字用“;”分隔
select replace(to_char(wm_concat(name)),',',';') names from t_example_employee where age=27;
---------------------------------------------------
NAMES
lili;tom
---------------------------------------------------
看到这里,我想到了以前有人问过的一个需求:一个表有50个字段,而我只需要查询49个字段,如果来得到select的内容,难到要一个一个去写字段?其实我们就可以使用wm_concat()来实现,如下所示
select 'select ' || wm_concat(column_names) || ' from t_example_employee' sqlexpr from user_col_comments;
--------------------------------------------------------------------------------------
SQLEXPR
select ID,NAME,AGE from t_example_employee
--------------------------------------------------------------------------------------
有了上面的结果,你想删哪个字段就删哪个,是不是方便很多啊。