首页 > 解决方案 > 在雪花中展平两个不同的 JSON 数组

问题描述

我有一个包含 JSON 数据的表,如下所示。

|---------------|
|    JSON_DATA  | 
|———————————————|
|     JSON_1    |
|     JSON_2    |
|---------------|

JSON_1 由如下数据组成

{
    "Money_Earned" : [
        {
           "money" :  2
        }
    ]
}

JSON_2 包含的数据如下

{
    "Money_Spent" : [
        {
           "money" :  3
        }
    ]
}

这是我从上表中检索数据的 SQL 代码,我正在展平 JSON 数组

SELECT v.value:money as money_earned,
        v2.value:money as money_spent
FROM TABLE, LATERAL FLATTEN(input => JSON_DATA: Money_Earned) v, LATERAL FLATTEN(input => JSON_DATA: Money_Spent) v2

我想要这张桌子

|-------------------------------------------------|
|     MONEY_EARNED       |      MONEY_SPENT       | 
|------------------------|------------------------|
|          2             |           0            | <== money_spent 0 because there is not money_spent in JSON_1
|          0             |           3            | <== money_earned 0 because there is not money_earned in JSON_2
|-------------------------------------------------|

但是当我使用上面的 SQL 代码时,我得到了一些其他的表。我不明白我在哪里做错了

标签: sqlsnowflake-cloud-data-platform

解决方案


你的“钱”是一个只有一个成员的 JSON 数组。如果它始终是单个成员,您可以这样做(使用表名 FOO 和列名 JSON_DATA):

select    zeroifnull(JSON_DATA:Money_Earned[0].money) as MONEY_EARNED,
          zeroifnull(JSON_DATA:Money_Spent[0].money) as MONEY_SPENT
from foo;

我使用了一张看起来像这样的桌子。如果您的实际数据更复杂,请发布示例:

create temp table foo(JSON_DATA variant);
insert into foo select parse_json('{"Money_Earned":[{"money":2}]}');
insert into foo select parse_json('{"Money_Spent":[{"money":3}]}');
insert into foo select parse_json('{"Money_Earned":[{"money":6}], "Money_Spent":[{"money":7}]}');

推荐阅读