我有一个包含 json variant
的表,其中包含可能存在也可能不存在的键,具体取决于 API 响应。
示例表:
create or replace temporary table test (variant_col variant);
insert into test(variant_col)
select parse_json('{"response": [{"key1":[1,2,3]}, {"key2":[7,8,9]}]}');
insert into test(variant_col)
select parse_json('{"response": [{"key2":[7,8,9]}]}');
我想根据它们的键横向展平它们,并使用key1
(如果存在),否则使用key2
(它将始终存在)
SELECT
iff(f2.value::int is null, 'key2', 'key1') as value_type,
ifnull(f2.value::int, f3.value::int) as desired_value
FROM
test,
LATERAL FLATTEN(input => response) as f1,
LATERAL FLATTEN(input => f1.value:key1) as f2,
LATERAL FLATTEN(input => f1.value:key2) as f3
;
最佳答案
我们可以通过为每一行提供一个 id 来解决这个问题,然后我们可以联合
2 个查询的结果 - 取决于 key1
是否存在:
with data as (
select row_number() over(order by 0) id, *
from test
), rows_with_key1 as (
select data.*, value v
from data
, lateral flatten(input => variant_col:response) as f1
where f1.value:key1 is not null
), rows_without_key1 as (
select data.*, value v
from data
, lateral flatten(input => variant_col:response) as f1
where id not in (select id from rows_with_key1)
)
select id, value, variant_col
from rows_with_key1
, lateral flatten(input => v:key1) ff
union all
select id, value, variant_col
from rows_without_key1
, lateral flatten(input => v:key2)
;
关于json - 雪花中有条件横向展平,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75651672/