使用 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%';

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

  1. '1234' 字符串需要单引号而不是双引号 文字(这就是您收到 "no such column" 错误的原因), 和:
  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