之前寫程式,費老大勁實現了多行轉換成字串,結果因為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 || ' = ' using key;
loop
fetch cur into val;
exit when cur%notfound;
str := str || sep || val;
sep := ', ';
end loop;
close cur;
return str;
end;