【问题标题】:Filtering on JSON internal keys stored in PostgreSQL table过滤存储在 PostgreSQL 表中的 JSON 内部键
【发布时间】:2018-05-07 10:21:47
【问题描述】:

我有一个 JSON 格式的报告存储在 PostgreSQL 数据库表的一个字段中。 假设(简化的)表格格式是:

      Column       |            Type
-------------------+----------------------------
 id                | integer
 element_id        | character varying(256)
 report            | json

报告中数据的结构是这样的

{
  "section1":
    "test1": {
      "outcome": "nominal",
      "results": {
        "value1": 34.,
        "value2": 56.
      }
    },
    "test2": {
      "outcome": "warning",
      "results": {
        "avg": 4.5,
        "std": 21.
      }
    },
    ...
  "sectionN": {
    ...
  }      
}    

也就是说,在第一级有 N 个键(sections),每个都是一个带有一组键的对象(tests),每个结果和一组可变的结果,以(key, value) 对的形式。

我需要根据内部 JSON 键进行过滤。更具体地说,在这个例子中,我想知道是否有可能单独使用 SQL 来获取例如 results 部分中的 std 值高于某个阈值的元素,比如说10。我什至可以知道stdtest2,但我不知道先验在哪个部分。例如,使用此过滤器 (test2.std > 10.),将显示带有上述示例数据的记录,因为 test2 测试中的 std 变量的此值等于 21. (>10.)。

另一个更简单的过滤器可能是请求test2.outcome 不是nominal 的所有记录。

【问题讨论】:

    标签: json postgresql filter


    【解决方案1】:

    一种方式是jsonb_each,比如:

    select  section.key
    ,       test.key
    from    t1
    cross join
            jsonb_each(t1.col1) section
    cross join
            jsonb_each(section.value) test
    where   (test.value->'results'->>'std')::int > 10
    

    Example at SQL Fiddle.

    【讨论】:

    • 哇,我没有意识到这种可能性,真的让我很开心!该示例比我在现实中的示例更简单,但您的解决方案具有足够的可扩展性,而且...我测试过,它可以工作!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    相关资源
    最近更新 更多