PostgreSQL通过jsonb字段搜索

时间:2018-10-17 08:31:03

标签: sql postgresql jsonb postgresql-10 postgresql-json

在我的PostgreSQL数据库中,我具有以下架构:

var map = L.map('map', {
            crs: L.CRS.Simple,
            zoomDelta: 0.50,
            zoomSnap: 0,
            minZoom: -1,
            maxZoom: 1.5 ,
            touchZoom: true,
            fullscreenControl: true,
});

var bounds = [[0,0], [1000,1000]];
var image = L.imageOverlay('./images/map.svg', bounds).addTo(map);

以及以下查询:

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

如何在PostgreSQL中做到这一点?

这是数据库提琴,您可以尝试:

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

2 个答案:

答案 0 :(得分:1)

您可以在过滤前扩展 jsonb数组。使用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上创建的任何索引。如果您的数据不是很大,那没关系。小心使用。

答案 1 :(得分:0)

我想到了这个查询:

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