Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何创建SQL查询以使用1属性对JSON数组进行排序?_Sql_Json_Postgresql_Sql Order By_Lateral Join - Fatal编程技术网

如何创建SQL查询以使用1属性对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 }, {

我有一个带有列的表,其中包含一个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

这个答案假设您的表有一列(或者可能是列的组合),可以用来唯一标识记录。让我们称之为
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;