来自 PostgreSQL jsonb 数组的值查询
Value Query from PostgreSQL jsonb array
有
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()
函数是一个设置返回函数,因此您应该将其用作行源。在上述情况下,它是 laterally joined 到您的 table,因此您可以使用 tst.tst
数据中的列。每个数组元素都变成一行,其中包含一个简单的 jsonb
对象,您可以使用标准运算符对其进行检查。请注意,即使对于以 numeric
格式存储数字的 jsonb
类型,这些值也会以 text
形式出现,因此您需要转换为 numeric
.
有
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()
函数是一个设置返回函数,因此您应该将其用作行源。在上述情况下,它是 laterally joined 到您的 table,因此您可以使用 tst.tst
数据中的列。每个数组元素都变成一行,其中包含一个简单的 jsonb
对象,您可以使用标准运算符对其进行检查。请注意,即使对于以 numeric
格式存储数字的 jsonb
类型,这些值也会以 text
形式出现,因此您需要转换为 numeric
.