BQ使用CONTAINS条件

时间:2015-04-22 11:07:50

标签: google-bigquery

我正在与Bigquery合作处理一些Adwords数据,更准确地说,是从我们的目标网址中提取所有网址参数,以便我们可以更好地组织它等等。

我编写了以下查询,以便返回" DestinationURL"中可用的所有参数。表中的字段。如下:

SELECT Parameter
  FROM (SELECT NTH(1, SPLIT(Params,'=')) as Parameter,
        FROM (SELECT 
              AdID,
              NTH(1, SPLIT(DestinationURL,'?')) as baseurl,
              split(NTH(2, SPLIT(DestinationURL,'?')),'&') as Params
              FROM [adwords_accounts_ads.ads_all] 
              HAVING Params CONTAINS '='))

 GROUP BY 1

Runnig这将给我6个参数。这是正确但不完整的,因为在此测试表中我知道URL中还有2个其他参数未被提取。一个名为“' group'另一个名为' utm_content'。

现在如果我跑:

SELECT Parameter
  FROM (SELECT NTH(1, SPLIT(Params,'=')) as Parameter,
        FROM (SELECT 
              AdID,
              NTH(1, SPLIT(DestinationURL,'?')) as baseurl,
              split(NTH(2, SPLIT(DestinationURL,'?')),'&') as Params
              FROM [adwords_accounts_ads.ads_all] 
              HAVING Params CONTAINS 'p='))

 GROUP BY 1

我得到"组"参数显示。

问题是:不应该

"CONTAINS '='" 

条件包括

"CONTAINS 'p='" 

在结果中?同样的情况发生在't ='而不是' ='

有谁知道如何解决这个问题?甚至如何从包含URL的字符串中提取所有参数?

ps:使用LIKE产生完全相同的东西

谢谢!

1 个答案:

答案 0 :(得分:2)

Split创建一个REPEATED输出类型,你必须FLATTEN表才能正确看到。

我在params使用flatten,输出现在很好:

SELECT nth(1,SPLIT(Params,'=')) AS Param,
       nth(2,SPLIT(Params,'=')) AS Value
FROM flatten(SELECT 
                AdID, 
                NTH(1, SPLIT(DestinationURL,'?')) AS baseurl, 
                split(NTH(2, SPLIT(DestinationURL,'?')),'&') AS Params
                FROM
                    (SELECT 1 AS AdID,'http://www.example.com.br/?h=Passagens+Aereas&source=google&vt=0' AS DestinationURL) 
                HAVING Params CONTAINS '=',
            params
            )

输出:

+-----+--------+------------------+---+
| Row | Param  |      Value       |   |
+-----+--------+------------------+---+
|   1 | h      | Passagens+Aereas |   |
|   2 | source | google           |   |
|   3 | vt     | 0                |   |
+-----+--------+------------------+---+

注意:Web UI总是会缩小您的结果但是如果您选择目标表并取消选中"展平结果",您将获得包含重复部分列的单行。