【问题标题】:Query nested jsonb using postgres使用 postgres 查询嵌套的 jsonb
【发布时间】:2019-03-14 20:57:06
【问题描述】:

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

【问题讨论】:

    标签: json postgresql jsonb postgresql-9.6


    【解决方案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 进行比较时,该值将在稍后的查询评估中用双引号括起来

    下面的查询对我有用:

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

    见我的db<>fiddle

    【讨论】:

      猜你喜欢
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 2017-01-28
      • 2021-02-18
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 2022-01-02
      相关资源
      最近更新 更多