我有一列数据从具有以下ID的Google Ads提取UTM标签。它包含广告系列ID(“ ___”之前的初始部分),然后是广告组ID。在某些情况下,我们仅具有字符串形式的广告系列ID,这就是为什么我使用:: TEXT进行类型转换的原因。
这是插入时UTM标签的样子。
835783587___42385125483
eu
968720083___47551372269
en_usa_search_brand
648594695___38174608372
886097479___45386492795
en_trust_control
competitors
es
en_esp_search_route
1072851000___55370810634
我正在尝试将ID彼此分开并删除下划线,然后将其下推到另一个表中。
umc.campaign是包含UTM标签的列。
我正在创建此临时表,然后将其推送到下面的最终表。
CREATE TABLE reports.tmp_sem_attribution AS (
SELECT DISTINCT ON (umc.user_id)
umc.user_id,
umc.source,
umc.campaign ::TEXT,
(SPLIT_PART(REPLACE(campaign,'__','_'),'__',1)) :: TEXT AS campaign_id,
(SPLIT_PART(REPLACE(campaign,'__','_'),'__',2)) :: TEXT AS adgroup_id,
当我使用以下查询检查结果时,我看到一些广告组ID为空或其中有空格。
reports.sem_attribution_v2是我将ID推送到两个不同列中的表。
SELECT * FROM reports.sem_attribution_v2 WHERE adgroup_id =''
**RESULT**
Campaign_ID AdGroup ID
eu
1560591282
en_usa_search_brand
1560608121
en_trust_control
1560591282
en_fra_search_generic_manual
990427417
eu
如果你们可以阐明我如何以不同的方式处理此问题或该查询不正确。那将不胜感激。
谢谢。
答案 0 :(得分:1)
您可以使用REGEXP_REPLACE
SELECT REGEXP_REPLACE(campaign,'(\d+)___\d+','\1') as campaign_id,
REGEXP_REPLACE(campaign,'\d+___(\d+)','\1') as adgroup_id
FROM t;
或SUSBTRING
(带有条件条件)。
SELECT CASE
WHEN campaign ~ '(\d+)___(\d+)' THEN
substring(campaign FROM '(\d+)___') --extracts string before "__"
ELSE campaign --same string when pattern not found
end AS campaign_id,
CASE
WHEN campaign ~ '(\d+)___(\d+)' THEN
substring(campaign FROM '___(\d+)') --extracts string after "__"
ELSE campaign
end AS adgroup_id
FROM t;
答案 1 :(得分:0)
SPLIT_PART
函数将在拆分后再请求的字段较少时返回空字符串。例如:当只有一个字段而您想获得第二个字段时,您将得到一个空字符串。哪种方法对您来说是正确且合适的。
您可以简化查询,因为REPLACE
部分不是嵌套对象。
(SPLIT_PART(campaign, '___', 1))::TEXT AS campaign_id,
(SPLIT_PART(campaign, '___', 2))::TEXT AS adgroup_id
另一个改进可以是将空字符串替换为NULL
值。您可以在将数据插入reports.sem_attribution_v2
表中时做到这一点:
CASE WHEN adgroup_id = '' THEN NULL ELSE adgroup_id END