如何在Oracle SQL中拼接去重后的字段值?
Oracle SQL实现字段值去重后拼接的解决方案
针对你需要将每行的acc_1至acc_4字段值去重后拼接的需求,可以通过列转行+去重+聚合拼接的方式实现,以下是具体方案:
1. 测试表结构与数据
首先确认测试表的创建语句:
create table myTable ("user", acc_1, acc_2,acc_3,acc_4) as select 1, 't1', 't1', null,null from dual union all select 2, 't2', null, 't2','t2' from dual union all select 3, null, 't3', null,null from dual ;
注:
user是Oracle关键字,建议用双引号包裹避免语法冲突
2. 问题分析
直接使用字符串拼接符||会保留重复值和空值对应的冗余逗号,无法满足去重需求。需要先将多列转为单行数据,去重后再聚合拼接。
3. 解决方案SQL
使用UNPIVOT实现列转行,结合DISTINCT去重,最后用LISTAGG完成聚合拼接:
SELECT "user", LISTAGG(acc_val, ',') WITHIN GROUP (ORDER BY acc_val) AS acc FROM ( -- 列转行并去重,过滤空值 SELECT DISTINCT "user", acc_val FROM myTable UNPIVOT ( acc_val FOR acc_col IN (acc_1, acc_2, acc_3, acc_4) ) WHERE acc_val IS NOT NULL ) GROUP BY "user";
4. 执行结果
执行上述SQL后,将得到符合预期的输出:
| user | acc |
|---|---|
| 1 | t1 |
| 2 | t2 |
| 3 | t3 |
补充说明
UNPIVOT:将横向的acc_1至acc_4列转为纵向的acc_val行数据,同时保留user关联关系DISTINCT:去除同一user下重复的acc_val值LISTAGG:将去重后的acc_val按指定分隔符(此处为逗号)拼接成单个字符串
内容的提问来源于stack exchange,提问作者user18552635
相关产品推荐
相关产品推荐

