在使用 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
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 |