【问题标题】:Postgres jsonb object IN array of json objectsPostgres jsonb 对象 IN json 对象数组
【发布时间】:2020-06-05 13:38:53
【问题描述】:

例如,我有一个名为 user 的表,其中包含 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' 吗?还是我只使用 OR,例如:

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

我希望结果是 OR 产品,例如:我使用 '2020-01-01' OR '2020-01-03' test1test2 将出现在结果中。

任何帮助将不胜感激。

谢谢

【问题讨论】:

  • 您能否澄清一下您是否需要一个仅返回两个日期都存在的行的条件,或者您是否需要一个至少的解决方案其中一个日期存在
  • @a_horse_with_no_name 澄清添加.. 我需要运行 WHERE OR,因此至少存在一个日期。
  • 您的第二个查询将做到这一点。
  • @a_horse_with_no_name 抱歉,离开了几天,现在回到这个项目。我不喜欢我的第二个查询,如果我有几个月(甚至年)的日期..它将成为一长串查询..即使我将以编程方式构建查询,我不禁想知道是否有更短的方法来做到这一点..

标签: sql json postgresql jsonb


【解决方案1】:

一种选择是使用带有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 运算符。

Demo

【讨论】:

  • 我理解“包括两个日期”因为两个值都需要出现在列表中,而不仅仅是一个(IN 会这样做)。
  • 好吧 @a_horse_with_no_name ,我理解 使用 IN 运算符是否包含列表中的两个或单个文字 :) 。感谢您的建议。
  • 不相关,但是:(login->>'byDate')::jsonb 可以简化为 login->'byDate',我认为两个带有 OR@> 条件比使用交叉连接取消嵌套所有元素更有效
  • 谢谢@a_horse_with_no_name ,已转换为login->'byDate'
  • @BarbarosÖzhan 这给了我我需要的结果.. 谢谢
【解决方案2】:

您可以使用 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))

但您使用 @> 的 OR 解决方案很可能会更有效。

【讨论】:

  • 我实际上需要一个 OR(至少一个).. 我正在权衡是否多次使用 OR 条件(就像在我的原始帖子中一样)或从 Barbaros 的回答中解决.. 谢谢
  • @GlenK:使用 EXISTS 的另一种解决方案可能比使用 CROSS JOIN 和 DISTINCT 更有效
猜你喜欢
  • 1970-01-01
  • 2018-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-13
  • 1970-01-01
  • 2018-10-27
  • 1970-01-01
相关资源
最近更新 更多