【问题标题】:how to select postgres rows where at least one json element matches some criteria?如何选择至少一个 json 元素与某些条件匹配的 postgres 行?
【发布时间】:2018-08-03 20:03:17
【问题描述】:

这是我正在使用的:

创建表测试(id INT,数据 JSON); 插入测试值 (1, '[{"key": 2}, {"key": 1}]'), (2, '[{"key": 3}]'), (3, '[{"key": 1}]'); 从测试中选择 *; 从测试中选择 id 1 == ANY( json_array_elements(data) ->> 'key');

我想要做的是选择所有行,其中data 列中的任何 json 对象的键 key 的值为 1。我试图提取行13。请注意,我不确定ANY 子句之前的相等比较== 是否正确。

当我运行上述程序时,我收到以下错误:ERROR: set-returning functions are not allowed in WHERE

【问题讨论】:

  • 您是绑定到数据类型json 还是jsonb 是一个选项?表大和性能相关吗?请始终声明您的 Postgres 版本。
  • 请参考这个类似的问题,了解为什么 ANY 不起作用 - stackoverflow.com/questions/21675174/…
  • 在 SQL 中,比较运算符是 = 修复它,它应该可以工作

标签: sql postgresql postgresql-json


【解决方案1】:

如果您可以随意使用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小提琴here

相关:

【讨论】:

    【解决方案2】:

    您可以使用EXISTS 和相关子查询来完成您想要的。

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

    SQL Fiddle

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      • 2022-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多