簡體   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