在使用 REGEXP 函数方面需要帮助

Need help in using REGEXP function

SELECT ID,
     CASE WHEN listagg(
            DISTINCT col_1,',') WITHIN GROUP(ORDER BY col_1)= '' THEN 'null' 
            ELSE (lower(LISTAGG(distinct col_1,',') WITHIN GROUP ( ORDER BY col_1))) END AS Col_001
        FROM 
            (SELECT distinct B.ID, date, timestamp, 
            TRY_CAST(pno as INTEGER) as pno,
            REGEXP_REPLACE(col_1,'\http.*$|null', '') as col_1
            FROM 
            table1 B LEFT JOIN table2 D ON D.ID=B.ID
            WHERE B.ID IN('5871162','35915895')
            and date='2021-11-02'
            ORDER BY pno) 
            GROUP BY ID;

当我 运行 上述查询时,我得到的结果类似于

ID                 COL_001

5871162            ,monthend_offer
35915895           dec_cashback,dec_offer

如果我用空字符串替换逗号,结果将如下所述,这不是例外结果

    5871162            monthend_offer
    35915895           dec_cashbackdec_offer

我只想替换第一条记录中的逗号“,”。记录应如下所示:

5871162            monthend_offer
35915895           dec_cashback,dec_offer

我只想替换前导逗号

关于如何实施这个的任何指导?

如果我理解正确,你可以使用另一个正则表达式。

select REGEXP_REPLACE(REGEXP_REPLACE(col_1,'\http.*$|null', '')),',','',1,1) as COL1;

1 表示正则表达式的起始位置,另外 1 表示他应该替换多少个。

希望对您有所帮助

要trim一个字符串你可以:

SELECT 
    column1, 
    ltrim(column1, ','),
    regexp_replace(column1, '^,')
FROM VALUES
    (',monthend_offer'),
    ('dec_cashback,dec_offer');

但你遇到问题的原因是你在 col_1 中有一个空字符串,它正在你的 listagg 中卷起。

CASE 语句(这个:)

   CASE 
        WHEN listagg(DISTINCT col_1,',') WITHIN GROUP(ORDER BY col_1)= '' THEN 'null' 
        ELSE lower(LISTAGG(distinct col_1,',') WITHIN GROUP ( ORDER BY col_1)) 
    END AS Col_001

可以写成:

IFNULL(NULLIF(lower(LISTAGG(distinct column2,',') WITHIN GROUP ( ORDER BY column2)),''),'null') as Col_001

见于:

SELECT column1,
    IFNULL(NULLIF(lower(LISTAGG(distinct column2,',') WITHIN GROUP ( ORDER BY column2)),''),'null') as smaler,
    CASE 
        WHEN listagg(DISTINCT column2,',') WITHIN GROUP(ORDER BY column2)= '' THEN 'null' 
        ELSE lower(LISTAGG(distinct column2,',') WITHIN GROUP ( ORDER BY column2)) 
    END AS Col_001
from values 
    (1,''),
    (2,'dec_cashback'),
    (1,'monthend_offer'),
    (2,'dec_offer')
GROUP BY 1 ORDER BY 1;
COLUMN1 SMALER COL_001
1 ,monthend_offer ,monthend_offer
2 dec_cashback,dec_offer dec_cashback,dec_offer