0

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

2 回答 2

1

'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;
于 2019-04-04T22:34:23.453 回答
0

此答案假定您的表具有可用于唯一标识记录的列(或可能是列的组合)。让我们称之为myid

首先,我们可以使用json_array_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_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}

DB Fiddle 上的演示

于 2019-04-04T22:30:12.083 回答