![](/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.