Как реализовать «LIKE ANY» в BigQuery (стандартный SQL)? - PullRequest
0 голосов
/ 12 февраля 2019

Я хотел бы использовать функцию «как любая».Однако BigQuery не распознает «ЛЮБОЙ» оператор.Есть ли какая-нибудь функция, которая может заменить «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')

Синтаксическая ошибка: неожиданное ключевое слово ANY в [12:47]

Ответы [ 3 ]

0 голосов
/ 12 февраля 2019

Вот альтернативный подход.Это сохранит ваш исходный запрос без изменений при реализации того, что вы хотите:

 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.

0 голосов
/ 13 февраля 2019

Ниже для BigQuery Standard 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'
0 голосов
/ 12 февраля 2019

Упрощенный запрос с той же проблемой:

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 ИЛИ

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

XXXX/herenkleding/XXX

Альтернатива 2: объединить в одно регулярное выражение

WITH table AS (
  SELECT 'XXXX/herenkleding/XXX' x
)

SELECT x
FROM TABLE
WHERE REGEXP_CONTAINS(x
  , '/(damesmode|herenkleding|kinderkleding|sportkleding)/')

XXXX/herenkleding/XXX
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...