Sql json对象数组中的Postgres jsonb对象

Sql json对象数组中的Postgres jsonb对象,sql,json,postgresql,jsonb,Sql,Json,Postgresql,Jsonb,比如说,我有一个名为user的表,其中login列的类型为jsonb 记录如下: user name | login ------------- test1 | {"byDate":[{"date":"2020-01-01"},{"date":"2020-01-02"},{"date":"2020-01-03"},]} test2 | {"byDate":[{"date":"2020-01-02"},{"date":"2020-01-03"},{"date":"2020-01-04"},]}

比如说,我有一个名为user的表,其中login列的类型为jsonb 记录如下:

user
name  | login
-------------
test1 | {"byDate":[{"date":"2020-01-01"},{"date":"2020-01-02"},{"date":"2020-01-03"},]}
test2 | {"byDate":[{"date":"2020-01-02"},{"date":"2020-01-03"},{"date":"2020-01-04"},]}
我如何
选择
(带有
WHERE
子句)以同时包含日期
'2020-01-01'
'2020-01-02'

就一次约会而言,我可以做到:

SELECT * 
  FROM "user" 
 WHERE "login" @> '{"byDate":[{"date": "2020-01-01"}]}'
我可以在
中使用某种类型的
来选择
'2020-01-01'
'2020-01-02'
?或者我只是使用或,例如:

SELECT * 
  FROM "user" 
 WHERE "login" @> '{"byDate":[{"date": "2020-01-01"}]}' 
    OR "login" @> '{"byDate":[{"date": "2020-01-02"}]}'
我希望结果是一个OR产品,例如:我使用
'2020-01-01'
'2020-01-03'
这两个
test1
test2
将显示在结果中

任何帮助都将不胜感激


谢谢

您可以使用现有条件:

select *
from the_table
where exists (select *
              from jsonb_array_eleements(login -> 'byDate') as x(d)
              where x.d ->> 'date' in ('2020-01-01', '2020-01-02))

但是使用
@>
的查询或解决方案可能会更有效。

一个选项是使用带有
jsonb\u array\u elements()
函数的查询

SELECT DISTINCT u.*
  FROM "user" u
 CROSS JOIN jsonb_array_elements(login->'byDate') j
 WHERE j->>'date' IN ('2020-01-01','2020-01-02')
包含在
运算符中的


我理解“包含两个日期”,因为列表中需要同时包含两个值,而不是一个值(in可以做到这一点)。好的@a_horse_和_no_name,我理解使用in运算符在列表中是包含两个还是单个文本:)。谢谢你的建议。不相关,但是:
(login->“byDate”)::jsonb
可以简化为
login->“byDate”
,我认为两个
条件加上
会比用交叉连接取消所有元素的测试更有效谢谢你@a_horse_和_no_name,转换为
login->“byDate”
@BarbarosÖzhan这是我需要的结果。。谢谢。请澄清您是否需要只返回两个日期都存在的行的条件,或者是否需要至少有一个日期存在的解决方案present@a_horse_with_no_name增加了澄清。。我需要运行一个WHERE OR,这样至少有一个日期存在。您的第二个查询可以做到这一点。@a_horse_,没有名字抱歉,离开了几天,现在回到这个项目。。我不喜欢我的第二个问题,就是如果我有几个月(甚至一年)的约会时间。。这将成为一长串的疑问。。尽管我将以编程方式构造查询,但我还是忍不住想知道是否有一种更短的方法来实现它..我实际上需要一个OR(至少一个)。。我正在权衡是否要多次使用或条件(如我原来的帖子中所述),还是按照Barbaros的答案来解决。。thanks@GlenK:使用EXISTS的另一个解决方案可能比使用交叉连接和DISTINCT更有效