postgresql - 将PostgreSQL中的jsonb转换为无循环的行
问题描述
ff我的 postgres 数据库中存储了一个 json 数组。第一个表“订单”如下所示:
order_id, basket_items_id
1, {1,2}
2, {3}
3, {1,2,3,1}
第二个表“项目”如下所示:
item_id, price
1,5
2,3
3,20
已经尝试使用多个 sql 加载数据并选择不同的 jsonb 记录,但这不是灵丹妙药。
SELECT
sum(price)
FROM orders
INNER JOIN items on
orders.basket_items_id = items.item_id
WHERE order_id = 3;
想要得到这个作为输出:
order_id, basket_items_id, price
1, 1, 5
1, 2, 3
2, 3, 20
3, 1, 5
3, 2, 3
3, 3, 20
3, 1, 5
或这个:
order_id, sum(price)
1, 8
2, 20
3, 33
解决方案
你的orders.basket_items_id
列是类型jsonb
还是int[]
?
如果类型是jsonb
您可以使用json_array_elements_text
扩展列:
SELECT
o.order_id,
o.basket_item_id,
items.price
FROM
(
SELECT
order_id,
jsonb_array_elements_text(basket_items_id)::int basket_item_id
FROM
orders
) o
JOIN
items ON o.basket_item_id = items.item_id
ORDER BY
1, 2, 3;
看到这个 DB-Fiddle。
如果类型是int[]
(整数数组),您可以使用以下函数运行类似的查询unnest
:
SELECT
o.order_id,
o.basket_item_id,
items.price
FROM
(
SELECT
order_id,
unnest(basket_items_id) basket_item_id
FROM
orders
) o
JOIN
items ON o.basket_item_id = items.item_id
ORDER BY
1, 2, 3;
推荐阅读
- reactjs - 在反应测试库中测试useEffect + jest
- php - MySQL 标签系统 - 如何选择与最后 N 个发布的帖子关联的所有标签?
- rust - Rust 可变迭代器问题 - 如何修复“无法推断适当的生命周期”错误?
- microsoft-edge - Microsoft Edge 商店拒绝了我的插件(搜索工具)。需要说明
- django - 无法将 CSV 文件导入 pgadmin 中的数据库
- c# - Brackeys Fps 控制器仅上下移动相机
- python - 有 numpy 有限的 argsort 吗?
- json - 我需要解析字典并更新它的值
- python - 优化从字典数据集中检索数据
- python - 如何在 tkinter 中使用纵横比调整根窗口大小?