#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