Sql 如何使用Jsonb从给定日期检索消息?

Sql 如何使用Jsonb从给定日期检索消息?,sql,postgresql,jsonb,Sql,Postgresql,Jsonb,我有下表: CREATE TABLE tbl (tbl_id int, messages jsonb); CREATE INDEX index_tbl ON tbl USING gin (messages); JSON消息作为数组: [{"user_id":1,"created_at":"2016-12-20","content":"Suspendisse accumsan tortor quis turpis. Sed ante."}, {"user_id":2,"created_at":

我有下表:

CREATE TABLE tbl (tbl_id int, messages jsonb);
CREATE INDEX index_tbl ON tbl USING gin (messages);
JSON消息作为数组:

[{"user_id":1,"created_at":"2016-12-20","content":"Suspendisse accumsan tortor quis turpis. Sed ante."},
 {"user_id":2,"created_at":"2016-12-20","content":"Morbi sem mauris tibulum sagittis sapien."},
 {"user_id":1,"created_at":"2016-10-21","content":"In blandit ultrices enim. Phasellus id sapien in sapien iaculis congue."},
 {"user_id":3,"created_at":"2016-11-20","content":"Quisque ut erat. Curabitur gravida nisi at nibh. In hac habitasse platea dictumst."},
 {"user_id":4,"created_at":"2016-12-21","content":"Nunc rhoncus dui vel sem. Sed sagittis. ectus. Pellentesque at nulla. Suspendisse potenti. Cras in purus eu magna vulputate luctus."},
 {"user_id":6,"created_at":"2016-12-21","content":"Praesent id massa id nisl venenatis lacinia. iaculis congue."}]
如何选择用户仅在一个月内收到的邮件? 例如,12月份的用户仅返回用户2、4和6的消息,因为用户1也在11月份。

这将返回所有

用户仅在一个月内收到的消息

使用重新启动JSON数组

提取相关键的值。只有日期的月份是相关的,请使用并将结果转换回最新状态

在步骤1产生的CTE消息上运行实际查询。二,。识别仅在一个月内发布的用户-在整个表中,而不仅仅是在一行中。你没有澄清,我选择了这个解释

自连接到同一CTE msg以返回用户的所有消息

GIN索引不会有帮助,因为您需要以任何方式检查每个数组元素

对于您的查询来说,首先将消息存储在规范化表中会更简单、更快:

message (user_id int, created_at date, content text)

嘿,伙计,谢谢你的回复。它工作得很好。没错,我正在考虑创建一个规范化的表。当有更多记录可用时,查询将花费很长时间。如果我想筛选特定月份的记录,我该怎么做?”从“从消息中选择发件人”中选择m.*,其中已创建的月=日期,2016-12-20'::时间戳::日期组由1创建,具有countDISTINCT的月=1 u使用发件人加入消息m;'
message (user_id int, created_at date, content text)