簡體   English   中英

PostgreSQL 通過 jsonb 字段搜索

[英]PostgreSQL searching by jsonb fields

在我的 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 = 2risk_score = 1推薦數據

所以查詢的結果應該是:

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

我怎樣才能在 PostgreSQL 中做到這一點?

這是您可以試驗的 db fiddle:

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

您可以在過濾之前擴展jsonb 數組。 jsonb_array_elements使用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創建的任何索引。 如果您的數據不是很大,那沒關系。 小心使用。

我想出了這個查詢:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM