Postgresql Postgres 9.6-由JSON数组组成的复杂查询jsonb字段

Postgresql Postgres 9.6-由JSON数组组成的复杂查询jsonb字段,postgresql,postgres-9.6,Postgresql,Postgres 9.6,我的桌子看起来像这样: CREATE TABLE myjsontable(data JSONB NOT NULL); INSERT INTO myjsontable VALUES ('[{"score":20 ,"category": 10 }, {"score":100 ,"category": 100 },{"score":500 ,"category": 50 }]'); INSERT INTO myjsontable VALUES ('[{"score":1000 ,"categor

我的桌子看起来像这样:

CREATE TABLE myjsontable(data JSONB NOT NULL);

INSERT INTO myjsontable VALUES ('[{"score":20 ,"category": 10 }, {"score":100 ,"category": 100 },{"score":500 ,"category": 50 }]');

INSERT INTO myjsontable VALUES ('[{"score":1000 ,"category": 40 }, {"score":30 ,"category": 50 },{"score":6000 ,"category": 100 }]');

INSERT INTO myjsontable VALUES ('[{"score":10 ,"category": 1 }, {"score":123 ,"category": 40 },{"score":1000 ,"category": 50 }]');

CREATE INDEX ON myjsontable USING GIN(data);
SELECT * FROM myjsontable WHERE data @> '[{ "category": 10}]';
我只想在json数组中的特定json上获取类别为X且分数高于Y的记录

我所能做的就是像这样使用contains:

CREATE TABLE myjsontable(data JSONB NOT NULL);

INSERT INTO myjsontable VALUES ('[{"score":20 ,"category": 10 }, {"score":100 ,"category": 100 },{"score":500 ,"category": 50 }]');

INSERT INTO myjsontable VALUES ('[{"score":1000 ,"category": 40 }, {"score":30 ,"category": 50 },{"score":6000 ,"category": 100 }]');

INSERT INTO myjsontable VALUES ('[{"score":10 ,"category": 1 }, {"score":123 ,"category": 40 },{"score":1000 ,"category": 50 }]');

CREATE INDEX ON myjsontable USING GIN(data);
SELECT * FROM myjsontable WHERE data @> '[{ "category": 10}]';
我希望我能做一些像NoSQL这样的简单查询

 SELECT * FROM myjsontable WHERE data @> '[{ "category": 10, "score": ">10" }]';

有什么方法可以实现简单但复杂的where子句,比如在我的字段是JSON数组的示例中

由于category&score作为json对象存储在json数组中,因此首先必须取消对数组的赋值,然后使用json访问器函数在where子句中比较值。在转换为int之前,需要将json转换为文本:

SELECT t.* 
FROM myjsontable t
CROSS JOIN JSONB_ARRAY_ELEMENTS(data) x
WHERE (x.value->>'category')::INT = 10 
  AND (x.value->>'score')::INT > 10
也可以使用EXISTS子句编写此查询。这一表述的意图更为明确:

SELECT * FROM myjsontable 
WHERE EXISTS (SELECT TRUE FROM JSONB_ARRAY_ELEMENTS(data) x
              WHERE (value->>'category')::INT = 10 
                AND (value->>'score')::INT > 10)

哦,谢谢你的留言,让我更新我的答案,以供将来的读者阅读