REGEXP_REPLACE И НЕ - PullRequest
       14

REGEXP_REPLACE И НЕ

1 голос
/ 18 апреля 2019

Интересно, может ли кто-нибудь помочь мне, пожалуйста?

Я пытаюсь собрать запрос REGEXP_REPLACE, который заменяет данные, но только если строка соответствует определенному условию.

Этозапрос, который я придумал:

SELECT
  #select all fields excluding those under the hits record
  * EXCEPT (hits),
  #start array - this rebuilds the hit record
  ARRAY(
  SELECT
    #unnest the hit field, select each field excluding those under the page record
    AS STRUCT * EXCEPT (page),
    (
    SELECT
      #select all page fields excluding pageTitle
      AS STRUCT page.* EXCEPT (pagePath),
      #remove the query parameter from the pagePath fields
      REGEXP_REPLACE(page.pagePath, r'\/invitations\/([a-zA-Z0-9]{8})\/', '/invitations/([a-zA-Z0-9]{8})/redacted') AS pagePath) AS page
  WHERE
    AND NOT page.pagePath= (r'\/invitations\/[a-zA-Z0-9]{8}\/(ltd|limited|co|business')
  FROM
    UNNEST(hits) ) AS hits
FROM
  `Test.Test.ga_sessions_20190401`

Запрос не работает, и часть, с которой я борюсь, - это ГДЕ НЕТ.Я пытался использовать AND NOT REGEXP_MATCH в дополнение к вышеперечисленному, но я не могу заставить это работать.

Мне просто интересно, может ли кто-нибудь взглянуть на это, пожалуйста, и дать несколько советов, как решить эту проблему?

Большое спасибо и всего наилучшего

Крис

Ответы [ 2 ]

1 голос
/ 22 апреля 2019

Ниже приведен стандарт SQL для Bigquery. Преимущество решения, представленного ниже, состоит в том, что оно не меняет структуру базовой таблицы, а просто выполняет замену при необходимости

#standardSQL
SELECT * REPLACE(
  ARRAY(
    SELECT AS STRUCT * REPLACE(
      (SELECT
        AS STRUCT page.* REPLACE(
        REGEXP_REPLACE(page.pagePath, r'\/invitations\/([a-zA-Z0-9]{8})\/', '/invitations/([a-zA-Z0-9]{8})/redacted') AS pagePath)
      ) AS page)
    FROM UNNEST(hits) AS hits
    WHERE NOT page.pagePath= (r'\/invitations\/[a-zA-Z0-9]{8}\/(ltd|limited|co|business')
  ) AS hits)
FROM `Test.Test.ga_sessions_20190401`   

Примечание с использованием SELECT * REPLACE вместо SELECT * EXCEPT

1 голос
/ 18 апреля 2019

Мне просто интересно, может ли кто-нибудь взглянуть на это, и предложить несколько советов, как решить эту проблему?

Две проблемы в вашем коде:

  1. FROM было после WHERE
  2. Extra AND после WHERE

Это правильное Sql:

SELECT
  #select all fields excluding those under the hits record
  * EXCEPT (hits),
  #start array - this rebuilds the hit record
  ARRAY(
  SELECT
    #unnest the hit field, select each field excluding those under the page record
    AS STRUCT * EXCEPT (page),
    (
    SELECT
      #select all page fields excluding pageTitle
      AS STRUCT page.* EXCEPT (pagePath),
      #remove the query parameter from the pagePath fields
      REGEXP_REPLACE(page.pagePath, r'\/invitations\/([a-zA-Z0-9]{8})\/', '/invitations/([a-zA-Z0-9]{8})/redacted') AS pagePath) AS page
  FROM
    UNNEST(hits) AS hits
  WHERE 
    NOT page.pagePath= (r'\/invitations\/[a-zA-Z0-9]{8}\/(ltd|limited|co|business')
    )
FROM
  `Test.Test.ga_sessions_20190401`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...