繁体   English   中英

根据条件将雪花变体列中的 JSON 值解析为多列

[英]Parsing JSON value in a Snowflake Variant column to multiple columns based on condition

我正在尝试解析表 table_a 中 test_column 列中的以下 JSON 数据。 如果标签部门有Electrical,dept_1应该默认为1,如果标签部门有Electronics,dept_2应该默认为1,如果标签部门有Chemical,dept_3应该默认为1。

测试列
{"labels": {"department_id": "1","department": ["Electrical","Electronics","Chemical"]}}
{"labels": {"department_id": "2","department": ["电气"]}}

我使用了下面的查询,但它没有产生我想要的 -

使用的查询:

select dept_id, 
case when dept='Electrical' then 1 else NULL end as dep1,
case when dept='Electronics' then 2 else NULL end as dep2,
case when dept='Chemical' then 3 else NULL end as dep3
from(
     SELECT 
         test_column:labels:department_id::varchar as dept_id, 
         array_to_string(test_column:labels:department,',') as dept
     FROM table_a
  );

你能告诉我出了什么问题吗? 对于具有全部 3 个电气、电子和化学的记录,我正在获取 NULL。

预期结果:

部门编号 部门_1 部门_2 部门_3
1 1 1 1
2 1 空值 空值

您有 2 个选项可以以不同的方式执行此操作。

选项#1:展平你的数组,然后重新聚合你的case语句:

WITH x AS (
    SELECT parse_json('{"labels": {"department_id": "1","department": ["Electrical","Electronics","Chemical"]}}') as var
)
SELECT  x.var:labels:department_id::integer as dept_id, 
        max(case when y.value::varchar='Electrical' then 1 else NULL end) as dep1,
        max(case when y.value::varchar='Electronics' then 2 else NULL end) as dep2,
        max(case when y.value::varchar='Chemical' then 3 else NULL end) as dep3
FROM x,
lateral flatten (input=>var:labels:department) y
group by 1;

选项#2 - 因为你的 case 语句只是评估一个值的存在,你可以使用ARRAY_CONTAINS函数查看数组来评估:

WITH x AS (
    SELECT parse_json('{"labels": {"department_id": "1","department": ["Electrical","Electronics","Chemical"]}}') as var
)
SELECT  x.var:labels:department_id::integer as dept_id, 
        case when array_contains('Electrical'::variant, var:labels:department::array) then 1 else NULL end as dep1,
        case when array_contains('Electronics'::variant, var:labels:department::array) then 2 else NULL end as dep2,
        case when array_contains('Chemical'::variant, var:labels:department::array) then 3 else NULL end as dep3
FROM x;

请尝试以下查询:

SELECT 
    test_column:labels:department_id::varchar as dept_id, 
    IFF(ARRAY_CONTAINS('Electrical'::VARIANT, test_column:labels:department), 1, NULL) as DEP_1,
    IFF(ARRAY_CONTAINS('Electronics'::VARIANT, test_column:labels:department), 1, NULL) as DEP_2,
    IFF(ARRAY_CONTAINS('Chemical'::VARIANT, test_column:labels:department), 1, NULL) as DEP_3
FROM table_a;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM