DB2中實現數據字段拼接(LISTAGG 與 xml2clob、xmlagg)
- 1. 使用函數LISTAGG()
- 1.1 同oracle實現方式
- 1.2 DB2中使用LISTAGG()
- 1.2.1 關于DB2版本
- 1.2.2 數據準備
- 1.2.3 代碼實現
- 2 解決DB2中關于 LISTAGG() 超長問題
- 2.1 使用xmlagg + xmlelement
- 2.2 將xml標簽去掉
1. 使用函數LISTAGG()
1.1 同oracle實現方式
- 關于oracle的,可以看下面的文章:
Oracle 常用簡單sql操作(insert into、merge into、start with connect by prior以及 regexp_substr等各種函數用法詳解).
1.2 DB2中使用LISTAGG()
1.2.1 關于DB2版本
- 我這里版本是
10.5
,經測試DB2 V9.7.0.10也是可以使用的(其他版本不知道,好像是9.7及以上),不知道自己版本的可以使用下面的sql查看一下:select * from sysibmadm.env_inst_info;
1.2.2 數據準備
- 關于數據準備可以看下面的文章,只不過是oracle版本的,但是大同小異,幾乎不怎么改動,如下:
oracle遞歸查詢(start with connect by prior)以及 樹形統計connect_by_root(子節點匯總到父節點).
1.2.3 代碼實現
- 先看
SYS_USER
表里的數據,如下:
- 將
部門D001
下的所有開發人員的姓名拼接在一個字段中,其實就是和oracle一模一樣,如下:SELECTDEPT_ID ,listagg(su.USER_NAME ,',') WITHIN GROUP (ORDER BY su.USER_NAME) all_user_names FROMSYS_USER su WHEREDEPT_ID = 'D001' GROUP BYDEPT_ID ;
2 解決DB2中關于 LISTAGG() 超長問題
2.1 使用xmlagg + xmlelement
xmlagg
語法如下:xmlagg(xmlelement(NAME [自定義xml標簽], '需要拼接的數據')) AS [字段別名]
xmlelement
,xmlelement()
是一個指定XML元素的函數。該函數需要提供以下兩個參數:- name:指定生成的XML標簽元素的名字。
- [需要拼接的數據]:元素中包含的數據,可以是一個或多個值,后可拼接自定義分隔符分隔。
xmlagg()
函數會將所有XML元素的結果以順序的方式連接成一個XML文檔,從而返回一個XML類型的值。
- 實現代碼:
SELECT DEPT_ID ,xmlagg(xmlelement(NAME userName, su.USER_NAME||',')) AS all_user_names FROM SYS_USER su WHERE DEPT_ID = 'D001' GROUP BY DEPT_ID;
- 實現代碼(加排序),如下:
SELECT DEPT_ID ,xmlagg(xmlelement(NAME userName, su.USER_NAME||',') ORDER BY su.USER_NAME ) AS all_user_names FROM SYS_USER su WHERE DEPT_ID = 'D001' GROUP BY DEPT_ID;
2.2 將xml標簽去掉
- 使用
replace()
函數,如下:SELECT [分組的字段名] ,replace(replace(xml2clob(xmlagg(xmlelement(NAME a, [需要拼接的字段名]||','))),'<A>',''),'</A>',' ') FROM [表名] GROUP BY [分組的字段名];
- 測試代碼實現,如下:
SELECT DEPT_ID , replace(replace(xml2clob(xmlagg(xmlelement(NAME userName, su.USER_NAME||','))),'<USERNAME>',''),'</USERNAME>',' ') AS all_user_names FROM SYS_USER su WHERE DEPT_ID = 'D001' GROUP BY DEPT_ID;