如何查询同一个json对象数组中的多个属性?

Posted

技术标签:

【中文标题】如何查询同一个json对象数组中的多个属性?【英文标题】:How to query on multiple attributes in the same json object array? 【发布时间】:2019-05-07 19:49:53 【问题描述】:

我的数据库的一列中有一个类似于此结构的 json 数组 -


"id": "123abc",
"Y/N": "Y",
"Color": "Purple",
"arr": [ 
   "time": 1210.55
   "person": "Sean"
   "action": "yes"   //The values for this field can only be 'yes', 'no, 'maybe'
   ,
   
   "time": 1230.19
   "person": "Linda"
   "action": "no"
   ],

我需要根据“arr”数组中对象的 2 个条件提取所有相应的属性。我想根据“时间”(最大值)获取最新的“arr”对象,但仅在"action" 等于“否”或“是”时才拉出此索引,因此当"action" = "maybe" 时排除所有对象.

我尝试使用WHERE 语句设置“时间”范围并使用ORDER BY DESC 提取最新条目并返回整个“arr”。这只是返回“时间”的最大值,但在 "action" = "maybe" 时返回所有属性,但我想返回只有“是”或“否”的对象。

这是我当前的查询 -

SELECT jsonb_build_object('ID', t.col -> '_id',
                          'Yes or No', t.col -> 'Y/N',
                          'arr', x.elem)
FROM   tbl t
CROSS  JOIN LATERAL (
   SELECT elem
   FROM   jsonb_array_elements(t.col -> 'arr') a(elem)
   WHERE a.elem -> 'time' between '1110.23' and '1514.12'
   AND t.col ->> 'Color' = 'Purple'
   ORDER  BY a.elem -> 'time' DESC NULLS LAST
   LIMIT  1
   ) x;

查询返回数组中时间最长的最新对象,但同时返回 "action" = "maybe" 时的对象。我尝试在 WHERE 语句后添加 AND a.elem -> 'action' = 'yes',但收到错误消息,提示令牌“是”无效。

是否可以返回一个“时间”最大的对象,其“动作”属性仅等于“是”或“否”?

【问题讨论】:

【参考方案1】:

您的代码交替使用->->>,但没有正确使用它们。

这里有很多很好的细节:What is the difference between `->>` and `->` in Postgres SQL?。

代码中使用-> 的任何地方都应该是->>,如果你在使用AND a.elem ->> 'action' = 'yes' 的where 子句中尝试它应该可以工作。

【讨论】:

以上是关于如何查询同一个json对象数组中的多个属性?的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL JsonB根据对象属性查询JSON数组中的对象

如何从android中的url解析多个JSON对象和数组?我正在使用一个示例,我希望在该示例中使用它,

jmeter中用json提取器提取响应数据中的多个值

雪花中具有多个 JSON 对象的横向展平数组

js怎么获取json中的多个对象?

根据JavaScript中的属性值从对象数组中选择[重复]