2017-07-20 37 views
0

我需要加入两个表,但是我想加入的字符串不是明显的匹配。下面是棘手的列(我们叫他们两个“关口”)两个表(请注意,在这些列中多了很多,但我只对其中包含单词“活动”条目感兴趣):在PostgreSQL中加入部分字符串匹配中的两个表

TableA       TableB 
Campaign eCom Q2 2016   PH_Campaign Q2_042016 
Campaign eCom Q3 2016   PH_Campaign Q3 ecomm_072016 
Campaign Q1 2017 (AUTH 380) PH_Campaign_Q1 2017_01012017 
Campaign Q2 2017 (AUTH 421) PH_Campaign_Q2_042017 
Campaign Q3 2017 (AUTH 451) Campaign_Q3_072017 
Campaign Q4 2016    PH_Campaign Q4_102016 
Campaign: Retail Stores  PH_Campaign Retail_092016 

我写他们,所以各行上的条目应搭配在一起

我想写这样

SELECT * 
FROM TableA A INNER JOIN TableB B 
ON A."date" = B."date" AND A.col LIKE B.col 

这就是我卡住查询......这是一个情况下正则表达式或能我用LIKE语句来做这件事?每一行都应该包含Campaign,季度和年份这两个字,因此对于第一行我会匹配Contains:“Campaign”,“Q2”和“2016”。然后是包含以下内容的最后一行:“广告系列”,“零售”。

我该怎么做?

+1

我会建议你在电子表格中排队的值,找出哪些比赛,然后加载到一个“匹配”表,以便连接表。 –

回答

1

你说列中有其他信息,但没有看到其他数据,你可能需要调整正则表达式字符串。但希望你明白这个主意。

WITH cte_a 
AS (
    SELECT col 
     ,substring(col FROM '%#"Campaign#"%' FOR '#') AS Campaign 
     ,substring(col FROM '%#"Q[1234]#"%' FOR '#') AS QTR 
     ,substring(col FROM '%#"20[0-9][0-9]#"%' FOR '#') AS YEAR 
    FROM table_a 
    ) 
    ,cte_b 
AS (
    SELECT col 
     ,substring(col FROM '%#"Campaign#"%' FOR '#') AS Campaign 
     ,substring(col FROM '%#"Q[1234]#"%' FOR '#') AS QTR 
     ,substring(col FROM '%#"20[0-9][0-9]#"%' FOR '#') AS YEAR 
    FROM table_b 
    ) 
SELECT * 
FROM cte_a 
INNER JOIN cte_b ON (
     cte_a.Campaign = cte_b.Campaign 
     AND cte_a.qTR = cte_b.QTR 
     AND cte_a.YEAR = cte_b.YEAR 
     ) 

HTH,

+0

谢谢埃德,这看起来非常棒!我也想加入A.“date”= B.“date”,我会在那里插入那个?右在与 结束INNER JOIN cte_b ON( cte_a.Campaign = cte_b.Campaign AND cte_a.qTR = cte_b.QTR AND cte_a.YEAR = cte_b.YEAR ) AND cte_a。 “日期”= cte_b“。日期“ ? – Greg

+0

格雷格,我将年份“2016”视为日期字段。如果不是,那么你需要使用正则表达式在每个CTE定义中定义日期字段,然后你可以将它包含在INNER JOIN循环中。 –