如何创建SQL查询以使用1属性对JSON数组进行排序?
我有一个带有列的表,其中包含一个JSON主体,该主体包含我希望根据与该数组关联的属性排序的数组 我已尝试选择数组名称并显示将显示整个数组的属性 列名为如何创建SQL查询以使用1属性对JSON数组进行排序?,sql,json,postgresql,sql-order-by,lateral-join,Sql,Json,Postgresql,Sql Order By,Lateral Join,我有一个带有列的表,其中包含一个JSON主体,该主体包含我希望根据与该数组关联的属性排序的数组 我已尝试选择数组名称并显示将显示整个数组的属性 列名为my_column,JSON格式如下- { "num": "123", "Y/N": "Y", "array1":[ { "name": "Bob", "sortNum": 123 }, {
my_column
,JSON格式如下-
{
"num": "123",
"Y/N": "Y",
"array1":[
{
"name": "Bob",
"sortNum": 123
},
{
"name": "Tim Horton",
"sortNum": 456
}
]
}
我希望输出基于sortNum
的最高值,因此查询应该显示Tim Horton的属性。我使用的代码如下,但在尝试基于sortNum进行查询时出错
SELECT my_column
FROM
my_table,
jsonb_array_elements(my_column->'array1') elem
WHERE elem->>'sortNum' = INT
这个答案假设您的表有一列(或者可能是列的组合),可以用来唯一标识记录。让我们称之为
myid
首先,我们可以使用json\u array\u elements
将json数组拆分为行,如下所示:
select myid, x.value, x->>'sortNum'
from
mytable,
json_array_elements(mycolumn->'array1') x
;
这将返回:
myid | value | sortnum
---------------------------------------------------------
1 | {"name":"Bob","sortNum":123} | 123
1 | {"name":"Tim Horton","sortNum":456} | 456
现在,我们可以将其转换为子查询,并使用ROW\u NUMBER()
在具有最高sortNum
属性的数组元素中进行筛选:
select value
from (
select
x.value,
row_number() over(partition by myid order by x->>'sortNum' desc) rn
from
mytable,
json_array_elements(mycolumn->'array1') x
) y
where rn = 1;
收益率:
value
-----------------------------------
{"name":"Tim Horton","sortNum":456}
按数组元素的
'sortNum'
字段降序,并使用限制1
仅获取顶部记录
SELECT jae.e
FROM my_table t
CROSS JOIN LATERAL jsonb_array_elements(t.my_column->'array1') jae (e)
ORDER BY jae.e->'sortNum' DESC
LIMIT 1;
编辑: 如果希望按数字排序而不是按字典排序,请将元素作为文本,并在排序之前将其强制转换为整数
SELECT jae.e
FROM my_table t
CROSS JOIN LATERAL jsonb_array_elements(t.my_column->'array1') jae (e)
ORDER BY (jae.e->>'sortNum')::integer DESC
LIMIT 1;