现在的位置: 首页 > 综合 > 正文

多行转换成字符串

2013年09月08日 ⁄ 综合 ⁄ 共 1435字 ⁄ 字号 评论关闭

之前写程序,费老大劲实现了多行转换成字符串,结果因为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;

 

 

抱歉!评论已关闭.