表"Orders":

orderId products
12345 [{"title":"product1","amount":2,"price":5.60},{"title":"product2","amount":1,"price":3.29}]

预期输出:

orderId title amount price
12345 product1 2 5.60
12345 product2 1 3.29

我设法走到了这一步:

with products_array as (
    select json_array_elements(products #> '{}')
    from Orders
)
select products_array.json_array_elements #>> '{title}'  as title,
       products_array.json_array_elements #>> '{amount}' as amount,
       products_array.json_array_elements #>> '{price}'  as price,
from products_array
title amount price
product1 2 5.60
product2 1 3.29

但我想不出怎么给每一行加"orderId".

在这方面有人能帮忙吗?

推荐答案

您可以使用JSON_ARRAY_ELEMENTS来提取json对象,然后使用CROSS JOIN LATERAL将它们与相应的"orderid"相关联.

SELECT orderid, 
       prods ->> 'title'  AS title,
       prods ->> 'amount' AS amount,
       prods ->> 'price'  AS price
FROM tab
CROSS JOIN LATERAL JSON_ARRAY_ELEMENTS(tab.products) as prods;

查看演示here.

Sql相关问答推荐

如何在SQL查询中只比较日期时间的年份和月份(而忽略日期比较)?

SUM(条件)在Oracle?

Trino/Presto sq:仅当空值位于组中第一个非空值之后时,才用值替换空值

JSON列之间的Postgr聚合

从列的不同值创建列

用于动态查询情况的存储过程常识模式

在SQL中将相同且紧挨着的元素进行分组

连接三个表的正确方式是什么?在这三个表中,可以显示在一个表上的行将在其他表中显示结果

你能过滤一个列表只返回多个结果吗?

使用列表作为参数进行 Select ,如果为空,则在PostgreSQL中不使用参数进行 Select

将日期时间转换为日期格式

在Power Bi中将SQL代码转换为DAX

如何使用聚合连接两个表

Postgres存在限制问题「小值」

在Snowflake中,如何将以逗号和连字符分隔的多个混合数值拆分成数字列表

for each 客户查找每个类别的最新评分

检索具有相同位置的最小和最大store 数量

SELECT 用于 Parent、Children 和 ORDER BY [Order] 列

条件意外地显着降低性能的地方

PlSql 陷入死循环