使用 postgres 查询嵌套的 jsonb
Query nested jsonb using postgres
我有一个嵌套的 jsonb 列,我正在尝试使用 Postgres9.6
Table: 测试
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;
我想你想要这样的东西:
SELECT *
FROM test t, jsonb_array_elements(t.data->'subject') e
WHERE e.value->>'test2' like '%12%';
实际上,我只是注意到您几乎可以在上次查询中使用它,但存在一些小的语法和逻辑错误:
'1234'
字符串需要单引号而不是双引号
文字(这就是您收到 "no such column" 错误的原因),
和:
- 您需要使用
->>
而不是 ->
来提取 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
我有一个嵌套的 jsonb 列,我正在尝试使用 Postgres9.6
Table: 测试
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;
我想你想要这样的东西:
SELECT *
FROM test t, jsonb_array_elements(t.data->'subject') e
WHERE e.value->>'test2' like '%12%';
实际上,我只是注意到您几乎可以在上次查询中使用它,但存在一些小的语法和逻辑错误:
'1234'
字符串需要单引号而不是双引号 文字(这就是您收到 "no such column" 错误的原因), 和:- 您需要使用
->>
而不是->
来提取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