Oracle一列的多行數(shù)據(jù)拼成一行顯示字符
成都創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供任丘網(wǎng)站建設(shè)、任丘做網(wǎng)站、任丘網(wǎng)站設(shè)計(jì)、任丘網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、任丘企業(yè)網(wǎng)站模板建站服務(wù),十多年任丘做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
oracle 提供了兩個(gè)函數(shù)WMSYS.WM_CONCAT 和 ListAgg函數(shù)。
先介紹:WMSYS.WM_CONCAT
例:
id name
1 aa
2 bb
3 cc
要的結(jié)果是"aa,bb,cc"
select WMSYS.WM_CONCAT(a.name) from user a
這樣的話,查詢出的結(jié)果:"aa,bb,cc"
分隔符如果不需要用英文的逗號(hào),需要改成別的符號(hào)比如分號(hào)的,可以用下面的方法替換下:
select replace(WMSYS.WM_CONCAT(a.name),',',';') from user a
結(jié)果:"aa;bb;cc"
======================================================================
ListAgg函數(shù)
listagg函數(shù)的語(yǔ)法結(jié)構(gòu)如下:
LISTAGG( [,]) WITHIN GROUP (ORDER BY ) [OVER (PARTITION BY )]
listagg雖然是聚合函數(shù),但可以提供分析功能(比如可選的OVER()子句)。使用listagg中,下列中的元素是必須的:
?需要聚合的列或者表達(dá)式
?WITH GROUP 關(guān)鍵詞
?分組中的ORDER BY子句
例子:
DEPTNO ENAME
--------- ----------
10 CLARK
10 KING
10 MILLER
20 ADAMS
20 FORD
20 JONES
按照DEPTNO字段分組,對(duì)結(jié)果集進(jìn)行字符串聚合,結(jié)果如下:
DEPTNO AGGREGATED_ENAMES
--------- -------------------------
10 CLARK,KING,MILLER
20 ADAMS,FORD,JONES
SQL:
SELECT deptno,LISTAGG(ename, ',') WITHIN GROUP (ORDER BY ename) AS employees FROM emp GROUP BY deptno;
因?yàn)?x'||to_char(sysdate,'dd')=‘xxxx’這個(gè)條件不滿足,所以查詢不到數(shù)據(jù)。
'x'||to_char(sysdate,'dd')明顯不等于'xxxx',能查詢到數(shù)據(jù)就是怪事了。
如果你想查詢到數(shù)據(jù),必須保證'x'||to_char(sysdate,'dd')的值等于'xxxx'
就拿今天來(lái)說(shuō)'x'||to_char(sysdate,'dd')的值肯定是x24。
'xxxx'的值是為xxxx,不等于x24??隙ú樵儾坏綌?shù)據(jù)。
你這個(gè)語(yǔ)句就跟
select
name
from
a
where
12這個(gè)語(yǔ)句的效果一樣。
如果你的xxxx表示你表中的一個(gè)字段,比如x1,x2..x31,
如:
select
name
from
a
where
'x'||to_char(sysdate,'dd')=x24;
你做關(guān)聯(lián)的是用你的字段名,但是判斷取值的是時(shí)候,卻是取的x24這一列里面的值。
如果x24這一列里面有一列的值是x24,肯定查得出數(shù)據(jù),如果沒(méi)有,肯定就查不出來(lái),
你先確實(shí)有沒(méi)得x24這條數(shù)據(jù)記錄了來(lái)。。
在根據(jù)條件模糊查詢的時(shí)候,有如下三種寫法:
SELECT * from tab1 t where t.col1 like '%a%';
SELECT * from tab1 t where t.col1 like '%' || 'a' || '%';
SELECT * from tab1 t where t.col1 like concat(concat('%','a'),'%');
如上三種寫法的等效的,最常用的是第一張寫法,第二種第三種使用拼接,但是不同在于 || 可以無(wú)限拼接,類似于拼接字符串時(shí)候的 +,而concat 是oracle中的函數(shù),CONCAT(char1 , char2),此函數(shù)中有且僅有2個(gè)參數(shù),所以第三種寫法拼接了2次。