在 BQ 中将数组转换为列

Transforming Arrays into Columns in BQ

原始问题 -

当您想从数组元素中提取相同信息时,原问题中建议的解决方案很有效。但就我而言,我想从每个数组元素中提取的信息可能不同。例如-如果您看到原始问题,我们拥有的第三个数组元素没有 jsonPayload,而是其中包含 nameValuePairs。如果我在那里使用数据透视表,则会创建不必要的字段。如何避免它们,我知道我们可以使用 EXCEPT 但我不认为这是一个好的解决方案,因为如果我必须从每个数组元素中选择不同的元素,那将是一团糟。因为我可以在有效载荷数组中包含 10 个以上的有效载荷。

SQL -

select * from (
  select 
    json_value(payload,'$.pool') as pool,
    json_value(payloadArr, '$.name') as name, 
    json_value(payloadArr, '$.fullpath') as fullPath,
    json_value(payloadArr, '$.jsonPayload.body') as payload,
    json_value(payloadArr, '$.nameValuePairs.data.one') as nv, 
  from  table t
  , unnest(json_extract_array(payload, '$.payloads')) payloadArr
)
pivot (any_value(fullPath) as fullPath , any_value(payload) as payload,  any_value(nv) as nv for name in ('request', 'response', 'attributes') ) 

下面使用

select * from (
  select 
    json_value(payload,'$.pool') as pool,
    json_value(payloadArr, '$.name') as name, 
    json_value(payloadArr, '$.fullpath') as fullPath,
    coalesce(
      json_value(payloadArr, '$.jsonPayload.body'),
      json_value(payloadArr, '$.nameValuePairs.data.one')
    ) as payload, 
  from  table t
  , unnest(json_extract_array(payload, '$.payloads')) payloadArr
)
pivot (any_value(fullPath) as fullPath , any_value(payload) as payload for name in ('request', 'response', 'attributes') )     

有输出