sql - 在雪花中展平两个不同的 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 代码时,我得到了一些其他的表。我不明白我在哪里做错了
解决方案
你的“钱”是一个只有一个成员的 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}]}');
推荐阅读
- parsing - 使用 megaparsec 正确解析嵌套数据
- python - 从自定义资源中读取参数作为 lambda 中的 json 会导致 json 解码错误
- sql - 如何在运行 INSERT 查询时进行列检查?
- css - 无法覆盖引导程序来实现我自己的 CSS
- html - 当 div 存在于两者之间时,如何使用 nth-child 选择具有特定类的 div?
- reactjs - 在类组件中使用 TypeScript 和 Redux 进行编程式 React Router 导航
- javascript - 当redux中数据模型状态中的数据发生变化时,我无法在react中使用useeffect捕获更改事件
- r - 如何使用 yaml 标头覆盖默认 pandoc 选项以在 rmarkdown 中指定 Github Markdown?
- python - 如何注释条之间的差异?
- python - Flask-WTF 表单验证失败