使用postgres查询嵌套jsonb
我有一个嵌套的jsonb列,我正在尝试使用Postgres9.6查询jsonb中类似于值的字段,或者是确切的值 表:测试 Jsonb列:数据使用postgres查询嵌套jsonb,json,postgresql,jsonb,postgresql-9.6,Json,Postgresql,Jsonb,Postgresql 9.6,我有一个嵌套的jsonb列,我正在尝试使用Postgres9.6查询jsonb中类似于值的字段,或者是确切的值 表:测试 Jsonb列:数据 { "subject":[ { "test1": "blue", "test2": "12", "test3": "green" }, { "test1": "red", "test2": "1234",
{
"subject":[
{
"test1": "blue",
"test2": "12",
"test3": "green"
},
{
"test1": "red",
"test2": "1234",
"test3": "green"
}
]}
我试过这个:
SELECT * from test where data ->'subject'->>'test2' like '%12%';
还尝试了一个包含查询:
SELECT '{"test":{test1: "blue"}}' :: jsonb@> '{"test":{}}'::jsonb
最后,尝试访问jsonb元素,但获取列“1234”不存在错误
SELECT * FROM test
WHERE EXISTS (SELECT FROM jsonb_array_elements(test.data -> 'subject') as s
WHERE (s->'test2'= "1234"));
第一次运行,但我没有得到任何数据
出现错误的函数
CREATE FUNCTION search_data (search text)
RETURNS setof test AS $$
SELECT *
FROM test t, jsonb_array_elements(t.data->'subject') e
WHERE e.value->>'test2' like '%search%';
$$ language sql stable;
我想你想要的是:
SELECT *
FROM test t, jsonb_array_elements(t.data->'subject') e
WHERE e.value->>'test2' like '%12%';
事实上,我刚刚注意到,您的上一个查询几乎完成了,但是有几个小的语法和逻辑错误:
'1234'
字符串周围需要单引号而不是双引号
literal(这就是为什么会出现“no-this column”错误),
以及:->
而不是->
来提取数据->'test2'
,因此它被提取为varchar
而不是jsonb
。否则,当jsonb
隐式转换为varchar
以将其与'1234':varchar进行比较时,该值将在稍后的查询求值中用双引号括起来
SELECT * FROM test
WHERE EXISTS (SELECT FROM jsonb_array_elements(test.data->'subject') as s
WHERE (s->>'test2' = '1234'));
看我的