代码之家  ›  专栏  ›  技术社区  ›  Mateusz Urbański

PostgreSQL按jsonb字段搜索

  •  1
  • Mateusz Urbański  · 技术社区  · 7 年前

    在我的PostgreSQL数据库中,我有以下模式:

    CREATE TABLE referral_datas (
        id integer,
        referrals jsonb
    );
    
    INSERT INTO referral_datas (id, referrals)
      VALUES (1, '[{"risk_score": "1"}]');
    
    INSERT INTO referral_datas (id, referrals)
      VALUES (2, '[{"risk_score": "2"}]');
    
    INSERT INTO referral_datas (id, referrals)
      VALUES (3, '[{"risk_score": "3"}]');
    

    以及以下查询:

    select * from referral_datas where referrals @> '[{"risk_score": "2"}]'
    

    返回以下结果:

        id | referrals
    ----------------------------------------
        2  | [{"risk_score":"2"}]
    

    查询工作正常,但我想有一个查询,将找到引用数据与 risk_score = 2 risk_score = 1

        id | referrals
    ----------------------------------------
        1  | [{"risk_score":"1"}]
        2  | [{"risk_score":"2"}]
    

    https://www.db-fiddle.com/f/pP3AudKgUs242YJjR9mxaS/2

    2 回复  |  直到 7 年前
        1
  •  1
  •   Michel Milezzi    7 年前

    你可以的 扩大 jsonb_array_elements 致:

    SELECT 
        * 
    FROM 
        referral_datas c 
        JOIN jsonb_array_elements(c.referrals) AS foo(bar) ON TRUE
    WHERE
        foo.bar->>'risk_score' IN ('1', '2');
    

    请注意,这可能不会使用您在其上创建的任何索引 referral_datas.referrals

        2
  •  0
  •   Hitobat    7 年前

    我提出了这个问题:

    SELECT id,referrals FROM referral_datas
    WHERE referrals->0->>'risk_score' IN ('1','2');