使用postgres查询嵌套的jsonb

时间:2018-10-10 02:48:40

标签: json postgresql jsonb postgresql-9.6

我有一个嵌套的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;

1 个答案:

答案 0 :(得分:1)

我希望您想要类似的东西:

SELECT *
FROM test t, jsonb_array_elements(t.data->'subject') e
WHERE e.value->>'test2' like '%12%';

实际上,我只是注意到您几乎可以在上一个查询中使用它,但是有一些较小的语法和逻辑错误:

  1. 您需要在'1234'字符串周围使用单引号而不是双引号 文字(这就是为什么您会收到“无此列”错误的原因), 和:
  2. 您需要使用->>而不是->来提取data->'test2',因此它提取为varchar而不是jsonb。否则,当将jsonb隐式转换为varchar并将其与'1234'::varchar
  3. 进行比较时,该值将在查询评估中稍后用双引号引起来。

以下查询对我有用:

SELECT * FROM test
WHERE EXISTS (SELECT FROM jsonb_array_elements(test.data->'subject') as s
    WHERE (s->>'test2' = '1234'));

请参阅我的db<>fiddle