【问题标题】:How to implement "LIKE ANY" in BigQuery (standard SQL)?如何在 BigQuery(标准 SQL)中实现“LIKE ANY”?
【发布时间】:2019-07-05 20:08:24
【问题描述】:

我想使用“like any”功能。但是,BigQuery 无法识别“ANY”运算符。有什么功能可以代替“LIKE ANY”吗?

Bigquery - 标准 SQL

    SELECT
      date,
      CONCAT(fullvisitorid, CAST(visitid AS string)) ord_browsers,
      hits.appInfo.landingScreenName,
      channelgrouping,
      trafficSource.source,
      trafficSource.medium,
      CASE
        WHEN channelgrouping = 'seo_brand' THEN 'Branded'
        WHEN hits.appInfo.landingScreenName LIKE '%/article%'
      OR hits.appInfo.landingScreenName LIKE '%/p/%' THEN 'ADS'
        WHEN (hits.appInfo.landingScreenName LIKE ANY ('%/damesmode/%',  '%/herenkleding/%',  '%/kinderkleding/%',  '%/sportkleding/%')) THEN 'Plist'
        ELSE 'rest'
      END Landing_page
    FROM
      `meta-geography-145406.81187684.ga_sessions_*`,
      UNNEST(hits) AS hits
    WHERE
      (_table_suffix BETWEEN '20190201'
        AND '20190207')

语法错误:在 [12:47] 出现意外的关键字 ANY

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    同样问题的更简单查询:

    WITH table AS (
      SELECT 'XXXX/herenkleding/XXX' x
    )
    
    SELECT x
    FROM TABLE
    WHERE x LIKE ANY ( 
      '%/damesmode/%'  '%/herenkleding/%',  '%/kinderkleding/%',  '%/sportkleding/%'
    )
    
    Syntax error: Unexpected keyword ANY at [2:6]
    

    备选方案1:替换为一系列LIKE OR

    SELECT x
    FROM TABLE
    WHERE (x LIKE '%/damesmode/%' 
    OR x LIKE '%/herenkleding/%'
    OR x LIKE '%/kinderkleding/%'
    OR x LIKE'%/sportkleding/%')
    
    XXXX/herenkleding/XXX
    

    方案二:组合成一个正则表达式

    WITH table AS (
      SELECT 'XXXX/herenkleding/XXX' x
    )
    
    SELECT x
    FROM TABLE
    WHERE REGEXP_CONTAINS(x
      , '/(damesmode|herenkleding|kinderkleding|sportkleding)/')
    
    XXXX/herenkleding/XXX
    

    【讨论】:

      【解决方案2】:

      这是另一种方法。这将保持您的原始查询完好无损,同时实现您想要的:

       SELECT
            date,
            CONCAT(fullvisitorid, CAST(visitid AS string)) ord_browsers,
            hits.appInfo.landingScreenName,
            channelgrouping,
            trafficSource.source,
            trafficSource.medium,
            CASE
              WHEN channelgrouping = 'seo_brand' THEN 'Branded'
              WHEN hits.appInfo.landingScreenName LIKE '%/article%'
            OR hits.appInfo.landingScreenName LIKE '%/p/%' THEN 'ADS'
              WHEN (hits.appInfo.landingScreenName LIKE c) THEN 'Plist'
              ELSE 'rest'
            END Landing_page
          FROM
            `meta-geography-145406.81187684.ga_sessions_*`,
            UNNEST(hits) AS hits, UNNEST([
             '%/damesmode/%',
             '%/herenkleding/%',
             '%/kinderkleding/%',
             '%/sportkleding/%']) AS c
          WHERE
            (_table_suffix BETWEEN '20190201'
              AND '20190207')
      

      注意数组未嵌套,每个项目都在CASE 语句中进行比较。

      【讨论】:

        【解决方案3】:

        以下是 BigQuery 标准 SQL

        #standardSQL
        SELECT
          DATE,
          CONCAT(fullvisitorid, CAST(visitid AS STRING)) ord_browsers,
          hits.appInfo.landingScreenName,
          channelgrouping,
          trafficSource.source,
          trafficSource.medium,
          CASE
            WHEN channelgrouping = 'seo_brand' THEN 'Branded'
            WHEN REGEXP_CONTAINS(hits.appInfo.landingScreenName , '/(article|p)/') THEN 'ADS'
            WHEN REGEXP_CONTAINS(hits.appInfo.landingScreenName , '/(damesmode|herenkleding|kinderkleding|sportkleding)/') THEN 'Plist'
            ELSE 'rest'
          END Landing_page
        FROM `meta-geography-145406.81187684.ga_sessions_*`,
        UNNEST(hits) AS hits
        WHERE _TABLE_SUFFIX BETWEEN '20190201' AND '20190207'
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-07-18
          • 2016-11-23
          • 2018-09-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-12-17
          • 2017-02-20
          相关资源
          最近更新 更多