如何创建 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}

Demo on DB Fiddle

按照数组元素的'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;