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

如何在多列上使用LISTAGG并去除重复值

问题根源

你当前的写法错误在于:SALES_CTRY_LIST和DP_CTRY_LIST本身是已聚合完成的逗号分隔字符串,直接拼接后用LISTAGG(DISTINCT ...)只会对整个拼接后的字符串去重,无法拆分字符串内部的元素去重。比如SALES_CTRY_LIST = 'CN, US'、DP_CTRY_LIST = 'US, JP',拼接后是'CN, US, US, JP',LISTAGG无法识别内部重复的US。

解决方案

方案1:拆分元素→去重→重新聚合(推荐)

先把两个字符串列表拆分成单个国家元素,去重后再用LISTAGG合并。以Oracle为例(不同数据库拆分函数略有差异):

如果是全局合并所有行的两个列表:

WITH split_countries AS (
    -- 拆分销售国家列表
    SELECT DISTINCT TRIM(REGEXP_SUBSTR(SALES_CTRY_LIST, '[^,]+', 1, LEVEL)) AS country
    FROM PLA
    WHERE SALES_CTRY_LIST IS NOT NULL
    CONNECT BY REGEXP_SUBSTR(SALES_CTRY_LIST, '[^,]+', 1, LEVEL) IS NOT NULL
    UNION
    -- 拆分DP国家列表
    SELECT DISTINCT TRIM(REGEXP_SUBSTR(DP_CTRY_LIST, '[^,]+', 1, LEVEL)) AS country
    FROM PLA
    WHERE DP_CTRY_LIST IS NOT NULL
    CONNECT BY REGEXP_SUBSTR(DP_CTRY_LIST, '[^,]+', 1, LEVEL) IS NOT NULL
)
SELECT LISTAGG(country, ', ') WITHIN GROUP (ORDER BY country) AS TESTING
FROM split_countries;

如果是按行处理(比如每个主键对应的数据合并去重):

WITH split_rows AS (
    SELECT 
        PLA.id, -- 替换为你的行唯一标识字段
        TRIM(REGEXP_SUBSTR(PLA.SALES_CTRY_LIST, '[^,]+', 1, LEVEL)) AS country
    FROM PLA
    WHERE PLA.SALES_CTRY_LIST IS NOT NULL
    CONNECT BY 
        REGEXP_SUBSTR(PLA.SALES_CTRY_LIST, '[^,]+', 1, LEVEL) IS NOT NULL
        AND PRIOR PLA.id = PLA.id
        AND PRIOR SYS_GUID() IS NOT NULL -- 防止递归循环
    UNION
    SELECT 
        PLA.id,
        TRIM(REGEXP_SUBSTR(PLA.DP_CTRY_LIST, '[^,]+', 1, LEVEL)) AS country
    FROM PLA
    WHERE PLA.DP_CTRY_LIST IS NOT NULL
    CONNECT BY 
        REGEXP_SUBSTR(PLA.DP_CTRY_LIST, '[^,]+', 1, LEVEL) IS NOT NULL
        AND PRIOR PLA.id = PLA.id
        AND PRIOR SYS_GUID() IS NOT NULL
)
SELECT 
    id,
    LISTAGG(DISTINCT country, ', ') WITHIN GROUP (ORDER BY country) AS TESTING
FROM split_rows
GROUP BY id;

方案2:正则去重(仅适合简单场景)

如果不想拆分,可尝试用正则去除连续重复元素,但无法处理非连续重复,仅作临时方案:

CASE 
    WHEN PLA.SALES_CTRY_LIST IS NULL AND PLA.DP_CTRY_LIST IS NOT NULL 
        THEN PLA.DP_CTRY_LIST 
    WHEN PLA.DP_CTRY_LIST IS NULL AND PLA.SALES_CTRY_LIST IS NOT NULL 
        THEN PLA.SALES_CTRY_LIST 
    WHEN PLA.SALES_CTRY_LIST IS NOT NULL AND PLA.DP_CTRY_LIST IS NOT NULL 
        THEN REGEXP_REPLACE(
            PLA.SALES_CTRY_LIST || ', ' || PLA.DP_CTRY_LIST,
            '([^,]+)(, \1)+',
            '\1'
        )
END AS "TESTING"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 08:19:58