json - 连接 json 字段 id 对应于其他表中的列的表
问题描述
我有两个表,第一个表称为 orders,存储一个 json[] 数据类型,如下所示:
CREATE TABLE orders (id SERIAL, items: json[], price: REAL);
INSERT INTO orders (items, price) VALUES ('[{"itemId":1,"addons":["ice","cream"]},{"itemId":2,"addons":["mayo","peppers"]}]',12.4);
而另一个称为items,将与“itemId”对应的itemId存储在json数据类型中:
CREATE TABLE items(id SERIAL, name TEXT, price REAL);
INSERT INTO items(name,price) VALUES ('Chicken Bowl', 8.99);
我想以这样的方式加入表格,以从与订单表中的 itemId 对应的 items 表返回文本值,而不是 id 本身,例如为“itemId”返回“Chicken Bowl”而不是 1
解决方案
虽然模式对于这种类型的查询并不是很好,但这里有一种方法:
SELECT o.id, i.name
FROM orders AS o
LEFT JOIN LATERAL unnest(o.items) AS u ON (true)
INNER JOIN items AS i ON ((u->>'itemId')::int = i.id)
;
...产生(根据给定的测试数据):
id | name
----+--------------
1 | Chicken Bowl
(1 row)
如果要将所有项目汇总到每个订单,请使用以下命令:
SELECT o.id AS order, array_agg(i.name) AS items
FROM orders AS o
LEFT JOIN LATERAL unnest(o.items) AS u ON (true)
INNER JOIN items AS i ON ((u->>'itemId')::int = i.id)
GROUP BY 1;
...生产:
order | items
-------+------------------
1 | {"Chicken Bowl"}
(1 row)
推荐阅读
- html - 为什么我的汉堡菜单使用复选框不起作用?
- node.js - 无法将文件从云存储下载到云功能临时存储以读取和处理 CSV 导入
- couchdb - _users 数据库不存在
- java - Twitter API 显示“全文无价值”错误?
- spring-boot - Spring Batch 从 .txt 或 .dat 文件中读取
- python - 如何修复只运行一次的while循环?
- julia - 使用 Julia 1.0 findmax 相当于 numpy.argmax
- css - 如何停止单列容器的跳变边距
- mysql - 在mysql上使用2个不同的ID时如何查看具有2个以上主题的人
- elasticsearch - ElasticsearchStatusException 包含无法识别的参数:[ccs_minimize_roundtrips]]]