【问题标题】:How to query based on max size of attribute in a JSON object array如何根据 JSON 对象数组中属性的最大大小进行查询
【发布时间】:2019-04-19 01:56:48
【问题描述】:

我正在尝试基于 JSON 主体创建一个查询,该主体包含一个浮点数组中的属性。这个 JSON 对象数组可以包含多个索引,但我无法获得最大的属性和相关的。如何根据“日期”字段提取正确的数组索引?

我尝试过执行按 DESC 顺序排序并限制为 1 的 CROSS JOIN LATERAL 语句,但该数据库有多个需要查询的行。 JSON 结构:

{
"identification":"123a",
"array": [
   {
     "type":"created",
     "num": 123.45
   },
   {
     "type":"delete",
     "num": 123.46
   }
   ]
}

到目前为止,我的查询如下所示:

SELECT col -> 'identification' AS Identify FROM tbl t
CROSS JOIN LATERAL jsonb_array_elements(t.col -> 'array') jae (array)
ORDER BY jae.array -> 'num' DESC

我希望结果全部以 JSON 格式返回,包括“标识”属性。数组中“num”属性的最大数字,以及该对象中的其他属性,应与标识一起返回。它有点工作,但我看到查询返回数组的所有对象。查询结果应该是这样的

{
"Identify":"123a"
   "array":{
      "type":"delete",
      "num": 123.46
}
}

结果应省略“created”对象类型,仅返回基于“num”属性的最大大小的属性。

【问题讨论】:

    标签: sql arrays json postgresql


    【解决方案1】:

    应该这样做:

    SELECT json_build_object('Identify', t.col -> 'identification', 'array', x.elem)
    FROM   tbl t
    CROSS  JOIN LATERAL (
       SELECT a.elem
       FROM   jsonb_array_elements(t.col -> 'array') a(elem)
       ORDER  BY a.elem -> 'num' DESC NULLS LAST
       LIMIT  1
       ) x;
    

    db小提琴here

    返回json。你可能想要jsonb

    【讨论】:

    • 别名 a(elem) 在这里做了什么?
    • @JoshHale:声明表和列别名。对于更复杂的情况很有用,例如添加序数。对于简单的情况,我们可以使用简短的语法,但我更喜欢明确。 jsonb_array_elements()(与其他一些 json 函数一样)提供自己的结果列名称 - 在这种情况下为 value - 除非另有声明,否则可以使用它。
    • 好吧。谢谢
    猜你喜欢
    • 2018-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-22
    • 2018-07-12
    • 2017-06-13
    • 1970-01-01
    • 2022-07-08
    相关资源
    最近更新 更多