在PostgreSQL中使用SPLIT_PART

时间:2018-12-17 13:06:00

标签: sql postgresql

我有一列数据从具有以下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  

如果你们可以阐明我如何以不同的方式处理此问题或该查询不正确。那将不胜感激。

谢谢。

2 个答案:

答案 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; 

Demo

答案 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