摘要
本文主要讲解如何在不同的数据库间实现通过select 查询结果,并将多行查询结果拼接成一串的实现方式,包含Oracle、Mysql、SQLServer等等。本文涉及到的函数有wmsys.wm_concat、for XML PATH。
本文主要讲解如何在不同的数据库间实现通过select 查询结果,并将多行查询结果拼接成一串的实现方式,包含Oracle、Mysql、SQLServer等等。本文涉及到的函数有wmsys.wm_concat、for XML PATH。
1、oracle语句中如何把一列的值合并为一个值,用逗号隔开?
2、如何使用for XML PATH将查询结果合成一列,以逗号分隔
3、Oracle中使用wm_concat对多行查询结果进行拼接
有一个表table1
mid | qid | ckid |
A1 | KD001 | ck001 |
A1 | KD001 | ck002 |
B1 | QS123 | cd111 |
B1 | QS123 | cd112 |
C2 | RT001 | rt115 |
C2 | RT001 | cf001 |
C2 | RS156 | yu116 |
想要实现以下结果:当mid和QID相同时,拼接ckid,要求结果如下
mid | qid | ckid |
A1 | KD001 | ck001,ck002 |
B1 | QS123 | cd111,cd112 |
C2 | RT001 | rt115,cf001 |
C2 | RS156 | yu116 |
CREATE TABLE table1 ( mid CHAR (2), qid CHAR (5), ckid CHAR (5) ); INSERT INTO table1 VALUES ('A1', 'KD001', 'ck001'), ('A1', 'KD001', 'ck003'), ('B1', 'QS123', 'cd111'), ('B1', 'QS123', 'cd112'), ('C1', 'RT001', 'rt115'), ('C1', 'RT001', 'cf001'), ('C1', 'RS156', 'yu116'); -- 使用 FOR XML path SELECT a.mid, a.qid, ( SELECT ckid + ',' FROM table1 b WHERE a.mid = b.mid AND a.qid = b.qid FOR XML path ('') ) ckid FROM table1 a GROUP BY a.mid, a.qid -- 或者下面这个使用stuff FOR XML path SELECT a.mid, a.qid, stuff ( ( SELECT ',' + ckid FROM table1 b WHERE a.mid = b.mid AND a.qid = b.qid FOR XML path ('') ), 1, 1, '' ) ckid FROM table1 a GROUP BY a.mid, a.qid
以下函数请注意下:
a) to_char(wmsys.wm_concat(to_char( st.col_name))) as new_name
b) to_char: 将当前值转换成字符串类型;
c) wmsys.wm_concat:拼接函数
示例
--这种情况一般是策应多对多关系的中间表
--比如:惩罚方式(警告,罚款,记过) 对应人
--某个表中记录了 id ,user_name,user_id,mode_id,mode_name,现在要根据人去找方式,
SELECT t.user_id, to_char ( wmsys.wm_concat (to_char(t.mode_name)) ) AS modoe_name WHERE t.user_id = '1' GROUP BY t.user_id;
--结果会是: 1 记过,罚款,警告 结果拼接默认用逗号
----需要注意的是后面的分组条件,这个条件必须是出了拼接列之外的所有结果
SELECT t.user_id, t.user_name, to_char ( wmsys.wm_concat (to_char(t.mode_name)) ) AS modoe_name WHERE t.user_id = '1' GROUP BY t.user_id, t.user_name;