我有一个嵌套的jsonb列,我正在尝试使用Postgres9.6查询jsonb中的一个类似于值还是确切值的字段
表:测试
Jsonb列:数据
{
"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;
答案 0 :(得分:1)
我希望您想要类似的东西:
SELECT *
FROM test t, jsonb_array_elements(t.data->'subject') e
WHERE e.value->>'test2' like '%12%';
实际上,我只是注意到您几乎可以在上一个查询中使用它,但是有一些较小的语法和逻辑错误:
'1234'
字符串周围使用单引号而不是双引号
文字(这就是为什么您会收到“无此列”错误的原因),
和:->>
而不是->
来提取data->'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'));
请参阅我的db<>fiddle