Как использовать регулярное выражение с JSON_EXTRACT в большом запросе

#sql #regex #google-bigquery

#sql #регулярное выражение #google-bigquery

Вопрос:

У меня есть поле JSON в таблице больших запросов, и в настоящее время я использую следующий метод для извлечения из элемента id (например):

 coalesce(
   nullif(JSON_EXTRACT(e.event_payload, 'content_id'), ''),
   nullif(JSON_EXTRACT(e.event_payload, 'cid'), ''),
   nullif(JSON_EXTRACT(e.event_payload, 'c_id'), ''),
   ...
  ) AS content_id,
  

У меня нет шаблона для полей этого JSON… Возможно ли использовать РЕГУЛЯРНОЕ выражение с JSON_EXTRACT в таком большом запросе, как этот?

 JSON_EXTRACT(e.event_payload, "(content_id|cid|c_id)") as content_id
  

Комментарии:

1. Возможно ли присутствие всех трех ключей?

2. Нет, эти ключи представляют одну и ту же информацию, моя проблема в том, что JSON имеют разное происхождение, поэтому они не следуют одному шаблону…

Ответ №1:

Вы можете заменить возможные имена полей, а затем выполнить извлечение:

 SELECT
  JSON_EXTRACT(
    REGEXP_REPLACE(e.event_payload, r'"c_?id"', '"content_id"'),
    '$.content_id') as content_id
FROM dataset.table
  

В качестве автономного примера:

 WITH T AS (
  SELECT '{"cid": {"a": 1}}' AS event_payload UNION ALL
  SELECT '{"content_id": {"b": 2}}' UNION ALL
  SELECT '{"c_id": {"c": 3}}'
)
SELECT
  JSON_EXTRACT(
    REGEXP_REPLACE(e.event_payload, r'"c_?id"', '"content_id"'),
    '$.content_id') as content_id
FROM T AS e