json - 雪花中有条件横向展平

标签 json snowflake-cloud-data-platform flatten

我有一个包含 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/

相关文章:

sql - 计算多列的不同列数

python - Airflow 通过 Snowflake session_parameters

JavaScript 扁平化对象数组的数组

python - 展平由整数和列表组成的列表

android - 使用一份图像和一份 json 创建 Android REST 多部分请求

java - Java 中是否可以像 PHP 中那样使用混合变量?

Python:展平内部列表时保留外部列表

java - 字符串org.json.JSONException : Unterminated object at character

javascript - 从 JSON 数组的内容创建带有原型(prototype)函数的 JavaScript 对象