You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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后,将得到符合预期的输出:

useracc
1t1
2t2
3t3

补充说明

  • UNPIVOT:将横向的acc_1至acc_4列转为纵向的acc_val行数据,同时保留user关联关系
  • DISTINCT:去除同一user下重复的acc_val值
  • LISTAGG:将去重后的acc_val按指定分隔符(此处为逗号)拼接成单个字符串

内容的提问来源于stack exchange,提问作者user18552635

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 10:13:15