BigQuery-嵌套json-选择嵌套项等于的位置

时间:2019-02-19 19:03:37

标签: sql google-bigquery

在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行?最好在不直接索引“配置”数组中的第一个元素的情况下完成此操作,因为这样可能无法保证顺序。

2 个答案:

答案 0 :(得分:1)

您可以使用here中所述的BQ的一些简单JSON函数。

基于此,您可以找到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]}]}

答案 1 :(得分:1)

以下是用于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”在配置数组中的位置