postgres jsonb对象

qvtsj1bj  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(313)

例如,我有一个名为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"},]}

我该怎么做 SELECT (与 WHERE 条款)包括两个日期 '2020-01-01' 以及 '2020-01-02' ?
一次约会,我可以做:

SELECT * 
  FROM "user" 
 WHERE "login" @> '{"byDate":[{"date": "2020-01-01"}]}'

我能用点什么吗 IN 选择两者 '2020-01-01' 以及 '2020-01-02' ? 或者我只是使用,例如:

SELECT * 
  FROM "user" 
 WHERE "login" @> '{"byDate":[{"date": "2020-01-01"}]}' 
    OR "login" @> '{"byDate":[{"date": "2020-01-02"}]}'

我希望结果是一个或产品,例如:我使用 '2020-01-01' 或者 '2020-01-03' 两者 test1 以及 test2 将出现在结果中。
任何帮助都将不胜感激。
谢谢

kuhbmx9i

kuhbmx9i1#

一种选择是使用查询 jsonb_array_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 接线员。
演示

xe55xuns

xe55xuns2#

可以使用exists条件:

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))

但是你的解决方案 @> 很可能会更有效率。

相关问题