如何创建 SQL 查询以使用 1 个属性对 JSON 数组进行排序?
How to create SQL query to sort JSON array using 1 attribute?
我有一个 table 列,其中包含一个 JSON 主体,其中包含我要根据与该数组关联的属性进行排序的数组。
我试过选择数组名称并显示将显示整个数组的属性
列名称为 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
此答案假定您的 table 有一列(或可能是列的组合)可用于唯一标识记录。我们称它为 myid
.
首先,我们可以使用json_array_elements
将JSON数组拆分成行,如下:
select myid, x.value, x->>'sortNum'
from
mytable,
json_array_elements(mycolumn->'array1') x
;
这个returns:
myid | value | sortnum
---------------------------------------------------------
1 | {"name":"Bob","sortNum":123} | 123
1 | {"name":"Tim Horton","sortNum":456} | 456
现在,我们可以将其转换为子查询,并使用ROW_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'
字段降序排列,使用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' 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;
我有一个 table 列,其中包含一个 JSON 主体,其中包含我要根据与该数组关联的属性进行排序的数组。
我试过选择数组名称并显示将显示整个数组的属性
列名称为 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
此答案假定您的 table 有一列(或可能是列的组合)可用于唯一标识记录。我们称它为 myid
.
首先,我们可以使用json_array_elements
将JSON数组拆分成行,如下:
select myid, x.value, x->>'sortNum'
from
mytable,
json_array_elements(mycolumn->'array1') x
;
这个returns:
myid | value | sortnum
---------------------------------------------------------
1 | {"name":"Bob","sortNum":123} | 123
1 | {"name":"Tim Horton","sortNum":456} | 456
现在,我们可以将其转换为子查询,并使用ROW_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'
字段降序排列,使用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' 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;