从PostgreSQL jsonb数组查询值

雷纳

DROP TABLE IF EXISTS tst.tst;
CREATE TABLE tst.tst (id int primary key, j jsonb);
INSERT INTO tst.tst (id, j) VALUES
(1, '[{"name":"aaa","val":3,"bol":true}, {"name":"bbb","val":1,"bol":true}]'),
(2, '[{"name":"ccc","val":5,"bol":false},{"name":"bbb","val":4,"bol":false}]');

我想这样做(用伪代码):

SELECT * FROM tst.tst WHERE WITHIN OBJECT ('name' = 'bbb') AND ('val' > 2);

如果我有一个对象而不是一个数组,我可以这样做:

SELECT * FROM tst.tst WHERE ('name' = 'bbb') AND ('val' > 2);

作为一个json新手,我在这里研究了一些答案,尝试了一些方法,例如,这行得通,但与我想做的事情仍然相去甚远:

WHERE '4' IN (SELECT value->>'val' FROM jsonb_array_elements(j)) ..

也许我很近..

帕特里克
SELECT DISTINCT t.*
FROM tst.tst t, jsonb_array_elements(t.j) j
WHERE j.value->>'name' = 'bbb' AND (j.value->>'val')::numeric > 2;

jsonb_array_elements()函数是一个set-returning函数,因此您应该将其用作行源。在上述情况下,它横向连接到您的表,因此您可以使用tst.tst数据中的每个数组元素都变成一个包含单个简单jsonb对象的行,您可以使用标准运算符对其进行检查。请注意,即使对于jsonbnumeric格式存储数字类型,其值也会出现,text因此您需要将其强制转换为numeric

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章