BigQuery - вложенный json - выберите, где вложенный элемент равен - PullRequest
0 голосов
/ 19 февраля 2019

Наличие следующей таблицы в базе данных BigQuery, где столбец f0_

Row  |  f0_ 
1    | {"configuration":[{"param1":"value1"},{"param2":[3.0,45]}]}
2    | {"configuration":[{"param1":"value2"},{"param2":[3.0,45]}]}
3    | {"configuration":[{"param1":"value1"},{"param2":[3.0,36]}]}
4    | {"configuration":[{"param1":"value1"},{"param2":[3.0,46]}]}
5    | {"configuration":[{"param1":"value1"},{"param2":[3.0,30]}]}
6    | {"configuration":[{"param1":"value1"}]}

f0_ - это чистая строка.Есть ли способ написать запрос на выборку, где значение «param2» равно массиву [3.0, 45], что означает, что он будет возвращать только строки 1 и 2?Желательно было бы сделать это без прямой индексации первого элемента в массиве «configuration», так как порядок может быть не гарантирован.

Ответы [ 2 ]

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

Ниже для BigQuery Standrad SQL

#standardSQL
SELECT line
FROM `project.dataset.table`
WHERE REGEXP_EXTRACT(JSON_EXTRACT(line, '$.configuration'), r'{"param2":(.*?)}') = '[3.0,45]'  

Вы можете протестировать, поиграть с выше, используя примеры данных из вашего вопроса, как в примере ниже

#standardSQL
WITH `project.dataset.table` AS (
  SELECT '{"configuration":[{"param1":"value1"},{"param2":[3.0,45]}]}' line UNION ALL
  SELECT '{"configuration":[{"param1":"value2"},{"param2":[3.0,45]}]}' UNION ALL
  SELECT '{"configuration":[{"param1":"value1"},{"param2":[3.0,36]}]}' UNION ALL
  SELECT '{"configuration":[{"param1":"value1"},{"param2":[3.0,46]}]}' UNION ALL
  SELECT '{"configuration":[{"param1":"value1"},{"param2":[3.0,30]}]}' UNION ALL
  SELECT '{"configuration":[{"param1":"value1"}]}' 
)
SELECT line
FROM `project.dataset.table`
WHERE REGEXP_EXTRACT(JSON_EXTRACT(line, '$.configuration'), r'{"param2":(.*?)}') = '[3.0,45]'   

с результатом

Row line     
1   {"configuration":[{"param1":"value1"},{"param2":[3.0,45]}]}  
2   {"configuration":[{"param1":"value2"},{"param2":[3.0,45]}]}    

Желательно было бы сделать это без прямой индексации первого элемента в массиве «конфигурации», так как порядок может быть не гарантирован.

Примечание: это решение не зависит от положения "param2" в массиве конфигурации

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

Вы можете использовать некоторые из JQ-функций BQ, как описано здесь .

Исходя из этого, вы можете найти param2 и проверить, соответствует ли его значение тому, что вы ищете.Если вы не уверены в порядке конфигурации, вы можете перебрать массив, чтобы найти param2, но это не особенно эффективно.Я рекомендую вам попытаться найти способ, где param2 всегда является вторым полем в массиве.Я смог получить правильные результаты, например, так:

SELECT json_text AS correct_configurations
FROM UNNEST([
  '{"configuration":[{"param1":"value1"},{"param2":[3.0,45]}]}',
  '{"configuration":[{"param1":"value2"},{"param2":[3.0,45]}]}',
  '{"configuration":[{"param1":"value1"},{"param2":[3.0,36]}]}',
  '{"configuration":[{"param1":"value1"},{"param2":[3.0,46]}]}',
  '{"configuration":[{"param1":"value1"},{"param2":[3.0,30]}]}',
  '{"configuration":[{"param1":"value1"}]}'
  ])
AS json_text
WHERE JSON_EXTRACT(json_text, '$.configuration[1].param2') LIKE "[3.0,45]";

Дает результат:

Row | correct_configurations
1   | {"configuration":[{"param1":"value1"},{"param2":[3.0,45]}]}
2   | {"configuration":[{"param1":"value2"},{"param2":[3.0,45]}]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...