日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

java oracle.sql.struct转字符串_把Oracle查询结果的一列转换为一字符串

發(fā)布時(shí)間:2024/9/19 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java oracle.sql.struct转字符串_把Oracle查询结果的一列转换为一字符串 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

今天遇到一個(gè)問題,要把SQL查出來的一列轉(zhuǎn)化為字符串,如查詢語(yǔ)句為:

select distinct c_fundacco from(

select c_custno from tconfirm tc where tc.c_agencyno='254'? and?? tc.c_status='1'

minus

select c_custno from tfundbrokerrelation tfb where tfb.c_relationtype='0')a,taccoinfo tf where a.c_custno=tf.c_custno。

結(jié)果為:

c_fundacco

541000082246

541000150815

541000249050

541000275745

。。。。。。

現(xiàn)在要把查詢結(jié)果放到一個(gè)字符串v_fundaccos varchar2中,這樣可以在存儲(chǔ)過程錯(cuò)誤提示中直接輸出這個(gè)字符串。

raise_application_error(-20001,v_fundaccos);

第一想到的就是用游標(biāo),每次取出一行,然后累加到一個(gè)字符串變量中

,可是老大一看,就說這樣會(huì)效率挺慢的,能不能不用游標(biāo)用一個(gè)SQL語(yǔ)句實(shí)現(xiàn)。我第一的反應(yīng)就是這不可能的,但是老大既然這么說了,還是得想辦法啊。結(jié)果仔細(xì)一想,也不是不可能啊,按分組求和的思路可能可以寫出來,把sql變一下:

select distinct c_fundacco,1 r from(

select c_custno from tconfirm tc where tc.c_agencyno='254'? and?? tc.c_status='1'

minus

select c_custno from tfundbrokerrelation tfb where tfb.c_relationtype='0')a,taccoinfo tf where a.c_custno=tf.c_custno

這樣用r分組,還是有可能寫出來的,心想,要是字符串也有一個(gè)像數(shù)值一樣的sum就好了,這樣按r分組,sum()一下就好了。

有問題還是找google,搜字符串相加 oracle,結(jié)果還真讓我搜到了一個(gè)方便的函數(shù)可以解決這個(gè)問題。

這個(gè)函數(shù)為:SYS_CONNECT_BY_PATH

SYS_CONNECT_BY_PATH is valid only in hierarchical queries. It returns the path of a column value from root to node, with column values separated by char for each row returned by CONNECT BY condition.

用這個(gè)函數(shù)可以根據(jù)CONNECT BY條件把一列的值按‘父子’關(guān)系顯示,父與子用字符分開,好了,這樣我的問題就有解了:

select max(sys_connect_by_path(c_fundacco||chr(13)||chr(10),' ')v_fundaccos

from (

select distinct c_fundacco,1 r,rownum rn from(

select c_custno from tconfirm tc where tc.c_agencyno='254'

and tc.c_status='1'

minus

select c_custno from tfundbrokerrelation tfb

where tfb.c_relationtype='0'

)a,taccoinfo tf where a.c_custno=tf.c_custno

)

start? with? rn=1

connect? by?? prior rn=rn-1

group by r

這里用

start with cond1

connect by cond2 where cond3;

簡(jiǎn)單說來是將一個(gè)樹狀結(jié)構(gòu)存儲(chǔ)在一張表里,比如一個(gè)表中存在兩個(gè)字段:

id,parentid那么通過表示每一條記錄的parent是誰(shuí),就可以形成一個(gè)樹狀結(jié)構(gòu)。

用上述語(yǔ)法的查詢可以取得這棵樹的所有記錄。

其中COND1是根結(jié)點(diǎn)的限定語(yǔ)句,當(dāng)然可以放寬限定條件,以取得多個(gè)根結(jié)點(diǎn),實(shí)際就是多棵樹。

COND2是連接條件,其中用PRIOR表示上一條記錄,比如 CONNECT BY PRIOR ID=PRAENTID就是說上一條記錄的ID是本條記錄的PRAENTID,即本記錄的父親是上一條記錄。

COND3是過濾條件,用于對(duì)返回的所有記錄進(jìn)行過濾。

rn為用oracle的偽列,這樣我把根結(jié)點(diǎn)從一開始start? with? rn=1

prior rn=rn-1為上一條記錄,再用r分組,就可以實(shí)現(xiàn)我的需求了。

呵呵,看來Oracle的函數(shù)真是多阿,好多都沒有用過,有時(shí)間再看看它的分析函數(shù),這樣寫sql就簡(jiǎn)單多了

總結(jié)

以上是生活随笔為你收集整理的java oracle.sql.struct转字符串_把Oracle查询结果的一列转换为一字符串的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。