代码之家  ›  专栏  ›  技术社区  ›  Paymahn Moghadasian

如何选择至少有一个json元素符合某些条件的postgres行?

  •  3
  • Paymahn Moghadasian  · 技术社区  · 6 年前

    以下是我的工作内容:

    create table test(id INT, data JSON);
    INSERT into test values
      (1, '[{"key": 2}, {"key": 1}]'),
      (2, '[{"key": 3}]'),
      (3, '[{"key": 1}]');
    
    
    select * from test;
    select id from test where 1 == ANY( json_array_elements(data) ->> 'key');
    

    我要做的是选择 data 列有键 key 值为 1 . 我试图提取行 3 . 注意,我不确定是否相等比较 == 就在 ANY 子句是正确的。

    当我运行上面的代码时,会出现以下错误: ERROR: set-returning functions are not allowed in WHERE

    2 回复  |  直到 6 年前
        1
  •  3
  •   Erwin Brandstetter    6 年前

    如果你可以自由使用 jsonb 而不是 json (这在大多数情况下更可取),使用 jsonb "contains" operator @> :

    SELECT *
    FROM   test
    WHERE  data  @> '[{"key": 1"}]';
    

    可以使用带有默认运算符类的GIN索引或更专业的 jsonb_path_ops :

    CREATE INDEX test_data_gin_idx ON test USING gin (data jsonb_path_ops);
    

    db<gt;小提琴 here

    相关:

        2
  •  3
  •   sticky bit    6 年前

    你可以用 EXISTS 以及一个相关的子查询来完成您想要的任务。

    SELECT test.id
           FROM test
           WHERE EXISTS (SELECT *
                                FROM json_array_elements(test.data) jar(e)
                                WHERE jar.e->>'key' = '1');
    

    SQL Fiddle