【问题标题】:Bigquery: Filter through JSON arrayBigquery:通过 JSON 数组过滤
【发布时间】:2025-12-06 17:45:01
【问题描述】:

我在通过 json 数组过滤时遇到问题:

WITH table AS ( SELECT *
FROM UNNEST([
  '{"class" : {"students" : [{"type" : "a", "name":"David"},{"type" : "b", "name":"Max"}]}}',
  '{"class" : {"students" : [{"type": "b", "name":"Jamie"},{"type" : "a", "name":"Martin"}]}}',
  '{"class" : {"students" : [{"type" : "a", "name":"Julie"}, {type: "b""name": "Jamie"}]}}'
  ]) AS json_payload)

所以有一个 json 数组,我试图过滤并获取所有类型 ='a' 的名称。每个数组只能有 1 个 type='a'

我目前的解决方案是:

SELECT 
CASE 
  WHEN JSON_VALUE(json_payload,'$.class.students[0].type') ='a'
    THEN JSON_VALUE(json_payload,'$.class.students[0].name') 
  WHEN JSON_VALUE(json_payload,'$.class.students[1].type') ='a'
    THEN JSON_VALUE(json_payload,'$.class.students[1].name') 
  END AS myName
FROM table

我在想是否有比这个更好/更清洁的解决方案

谢谢!

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    获取所有类型 ='a' 的名称。每个数组只能有 1 个 type='a'

    使用下面的方法

    select json_extract_scalar(json, '$.name') name 
    from your_table,
    unnest(json_extract_array(json_payload, '$.class.students')) json
    where json_extract_scalar(json, '$.type') = 'a'            
    

    如果应用于您的问题中的示例数据

    WITH your_table AS ( SELECT *
    FROM UNNEST([
      '{"class" : {"students" : [{"type" : "a", "name":"David"},{"type" : "b", "name":"Max"}]}}',
      '{"class" : {"students" : [{"type": "b", "name":"Jamie"},{"type" : "a", "name":"Martin"}]}}',
      '{"class" : {"students" : [{"type" : "a", "name":"Julie"}, {"type": "b", "name": "Jamie"}]}}'
      ]) AS json_payload
    )               
    

    输出是

    【讨论】: