【问题标题】:Check if Postgres jsonb contains one of the values检查 Postgres jsonb 是否包含其中一个值
【发布时间】:2020-06-04 15:11:06
【问题描述】:

我需要检查 jsonb 字段是否可以是数组或字符串。 我拥有的简单数据:

INSERT INTO users (jsonb) VALUES
('{"name":"Henry", "favoritefood_1":["eggs","apples"]}'),
('{"name":"Herald","favoritefood_1":["apples","potatoes"]}'),
('{"name":"Helen", "favoritefood_1":"apples"}');

我应该如何找到喜欢苹果和鸡蛋的用户?我尝试了很多查询,最后一个是:

SELECT * FROM users
WHERE CASE
WHEN jsonb_typeof((jsonb->>'favoritefood_1')::jsonb) = 'array'
THEN jsonb_array_elements((jsonb->>'favoritefood_1')::jsonb) IN ('apples', 'eggs')
ELSE (jsonb->>'favoritefood_1')::jsonb IN ('apples', 'eggs') END

有人可以帮我吗?

【问题讨论】:

    标签: sql arrays json postgresql jsonb


    【解决方案1】:

    ? 应该可以工作:

    where jsonb -> 'favoritefood_1' ? 'apples'
    

    【讨论】:

    • 我建议使用or@>,但这要好得多。
    • @a_horse_with_no_name:谢谢。我实际上在发布之前对其进行了测试,我不确定 Postgres 是否那么聪明。为 Postgres +1,我越用越喜欢它。
    • 我有一些案例需要找到喜欢苹果或鸡蛋的用户
    • @psmagin: where jsonb -> 'favoritefood_1' ? 'apples' or jsonb -> 'favoritefood_1' ? 'eggs'
    【解决方案2】:
    where jsonb -> 'favoritefood_1' ?| array['apples', 'eggs']
    

    【讨论】:

    • 有理由更喜欢这个公式而不是几天前@GMB 提供的公式吗?
    • 我有不同数量的值可供搜索。所以创建这种类型的查询而不是@GMB 贡献更容易。
    猜你喜欢
    • 2021-04-18
    • 1970-01-01
    • 2018-07-25
    • 2021-06-06
    • 2020-10-10
    • 1970-01-01
    • 2013-09-06
    • 2018-06-17
    • 1970-01-01
    相关资源
    最近更新 更多