![](/img/trans.png)
[英]Snowflake - flatten multiple nested array values from json variant column
[英]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.