之前写程序,费老大劲实现了多行转换成字符串,结果因为SQL过于复杂被否了,然后就一顿改成在JAVA代码里处理查询结果返回指定格式。
以下借助学习trunc截取时间函数来做一个多行转换成字符串的例子。
--trunc截取当前月份第一天trunc(sysdate,'MM')
--wmsys.wm_concat()实现多行转换成字符串
select wmsys.wm_concat(monthDate)
from (select trunc(sysdate, 'MM') + rownum - 1 monthDate
from dual
connect by rownum <= to_number(to_char(last_day(SYSDATE), 'DD')));
--SYS_CONNECT_BY_PATH实现多行转换成字符串,用逗号连接;需要先生成递归树
select substr(max(sys_connect_by_path(monthDate, ',')), 2)
from (
---child和parent根据rownum生成层次关系
select monthDate, rownum parent, rownum + 1 child
from (select trunc(sysdate, 'MM') + rownum - 1 monthDate
from dual
connect by rownum <=
to_number(to_char(last_day(SYSDATE), 'DD'))))
start with parent = 1
connect by prior child = parent;
刚才在论坛了看到了cnwz自己写的函数,才意识到这个当初自己也可以写函数实现的,收藏一下:
function str_cat( key_name in varchar2,key in varchar2,coname in varchar2,tname in varchar2 ) return varchar2
/*
功能:根据指定的表名、连接字段名、关键字段名及值,返回字符串字段的连接值(类似聚合函数)
输入参数:
key_name:用于判断的关键字段名,字符串(大写,可以是表达式)
key:用于判断的关键字段值,字符串(大写,可以是表达式)
coname:连接的字段名,字符串(大写)
tname:输入,表名,字符串(大写)
返回值:连接后的字符串(分隔符:,)
*/
is
str varchar2(4000);
sep varchar2(2);
val varchar2(4000);
cur SYS_REFCURSOR;
begin
open cur for 'select '||coname||' from '|| tname || ' where ' || key_name || ' = :x ' using key;
loop
fetch cur into val;
exit when cur%notfound;
str := str || sep || val;
sep := ', ';
end loop;
close cur;
return str;
end;