json - Postgresql -> JSON 数组到行
问题描述
我表中的一列包含 JSONArray 数据。我在 jsonb 列中使用了 jsonb_agg() 到视图。现在视图中的数据如下所示
[
{
"Android": 2,
"Windows": 1,
"Macintosh": 1
},
{
"iOS": 1,
"Android": 2,
"Windows": 2,
"Macintosh": 2
},
{},
{
"Android": 1,
"Windows": 1
},
{
"Android": 1
},
{
"iOS": 1,
"Android": 2
},
{
"iOS": 2,
"Android": 1
},
{
"iOS": 2
},
{
"Android": 1
},
{
"iOS": 2,
"Windows": 1
},
{
"Android": 5
},
{},
{},
{
"iOS": 1,
"Android": 1
},
{},
{},
{
"Windows": 3
}
]
但是,我需要产生以下结果
{
"Android": 16,
"Windows": 8,
"Macintosh": 3,
"iOS": 9
}
PostgreSQL中有没有办法实现这一点?
解决方案
是的,有办法。这里是。
select to_jsonb(t.*) from
(
select
sum((j->>'Android')::numeric) "Android",
sum((j->>'Windows')::numeric) "Windows",
sum((j->>'Macintosh')::numeric) "Macintosh",
sum((j->>'iOS')::numeric) "iOS"
from jsonb_array_elements('[{"Android": 2, "Windows": 1, "Macintosh": 1}, {"iOS": 1, "Android": 2, "Windows": 2, "Macintosh": 2}, {}, {"Android": 1, "Windows": 1}, {"Android": 1}, {"iOS": 1, "Android": 2}, {"iOS": 2, "Android": 1}, {"iOS": 2}, {"Android": 1}, {"iOS": 2, "Windows": 1}, {"Android": 5}, {}, {}, {"iOS": 1, "Android": 1}, {}, {}, "Windows": 3}]'::jsonb) as j
) as t;
作为参数化查询:
select to_jsonb(t.*) from
(
select
sum((j->>'Android')::numeric) "Android",
sum((j->>'Windows')::numeric) "Windows",
sum((j->>'Macintosh')::numeric) "Macintosh",
sum((j->>'iOS')::numeric) "iOS"
from jsonb_array_elements(?::jsonb) as j
) as t;
推荐阅读
- python-3.x - Docker 容器中的 Azure CLI
- java - NestedScrollView 在 CoordinatorLayout 内是透明的,但是:我不希望它是透明的
- javascript - javascript剪切特定单词之前的文本
- c# - 控制台应用程序中的最大并行任务,以及调用 API 时如何处理“将内容复制到流时出错”
- c# - 针对数据库验证文件/档案 - 派生类是否正确?
- clickonce - 为什么使用 VS 测试证书时使用 QBFC 的 ClickOnce 应用程序会崩溃?
- c# - CS0104:“System.Numerics.Vector3”和“UnityEngine.Vector3”之间的引用不明确
- c - 如何在 macOS 上使用 Visual Studio 代码调试 ac 程序?
- asp.net-core - Azure 函数中的内容类型标头
- c++11 - 嵌套列表初始化如何转发它的参数?