Oracle 的 wm_concat 和 listagg 函數的使用

 

1.需求:

原始數據如下(建表sql在文章底部):

目標:根據type進行分組,把樓棟名去重後用"/"進行拼接

 

2.解決:

方案1:使用wm_concat  

select TYPE , wm_concat(NAME) NAME  from  T_BUILDING group by TYPE;

wm_concat  默認使用的是逗號進行拼接,結果如下(此時NAME的結果類型爲:BLOB):

再配合使用子查詢和replace函數達到目的,sql如下:

select t1.TYPE , replace(wm_concat(t1.NAME),',','/') NAME  from (select distinct TYPE,NAME from T_BUILDING) t1 group by t1.TYPE;

結果如下:

方案2:使用listagg

select t1.TYPE , listagg(t1.NAME,'/') WITHIN GROUP( ORDER BY t1.NAME) NAME  from (select distinct TYPE,NAME from T_BUILDING) t1 group by t1.TYPE;

結果如下(此時NAME的結果類型爲:VARCHAR):

 

 

附:表數據sql腳本如下:

create table T_BUILDING
(
	ID NUMBER not null
		constraint T_BUILDING_PK
			primary key,
	NAME VARCHAR2(200),
	TYPE NUMBER
)
/

comment on column T_BUILDING.NAME is '樓棟名'
/

comment on column T_BUILDING.TYPE is '類型'
/

INSERT INTO SCOTT.T_BUILDING (ID, NAME, TYPE) VALUES (1, '樓棟1', 1);
INSERT INTO SCOTT.T_BUILDING (ID, NAME, TYPE) VALUES (2, '樓棟2', 1);
INSERT INTO SCOTT.T_BUILDING (ID, NAME, TYPE) VALUES (3, '樓棟1', 1);
INSERT INTO SCOTT.T_BUILDING (ID, NAME, TYPE) VALUES (4, '樓棟11', 2);
INSERT INTO SCOTT.T_BUILDING (ID, NAME, TYPE) VALUES (5, '樓棟22', 2);

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章