【问题标题】:PostgreSQL JSONB Array - Find if a key existsPostgreSQL JSONB 数组 - 查找键是否存在
【发布时间】:2017-09-29 13:43:35
【问题描述】:

表 Product 在 PostgreSQL 9.6 中有一个 jsonb 列 attributes,并包含 attributes 列的以下条目。

记录 1:

[
  {    "KEY1": "VALUE1",    "KEY2": "VALUE2"  },
  {    "KEY1": "VALUE3",    "KEY3": "VALUE4"  },
]

记录 2:

[
  {    "KEY1": "VALUE1",    "KEY2": "VALUE2"  },
  {    "KEY3": "VALUE3",    "KEY4": "VALUE4"  },
]

我们如何过滤包含KEY4 键的记录? 给定here 的 jsonb 运算符不提供 jsonb 数组的详细信息。

【问题讨论】:

    标签: postgresql postgresql-json


    【解决方案1】:

    对于这样的表:

    create table test_table
    (
      id serial not null,
      data jsonb
    );
    

    使用您的数据

    SELECT id, arr_elem
    FROM test_table AS tt, jsonb_array_elements(
        (
          SELECT data
          FROM test_table
          WHERE id = tt.id
        )
    ) AS arr_elem
    WHERE arr_elem#>'{KEY4}' IS NOT NULL
    

    您基本上解包数组并将其与源表连接起来。

    结果:

    id , arr_elem

    2 , {"KEY3": "VALUE3", "KEY4": "VALUE4"}

    SQLFiddle

    【讨论】:

      【解决方案2】:

      您必须替换正确的表名和列名,但这应该可以解决问题:

      FROM your_table jsonb_array_elements(your_table.the_array_key->'your_column') AS something WHERE something->>'KEY4'::text != 'null'

      如果不知道表名和列名,很难确定。底线是您需要使用json_array_elements。

      【讨论】:

      • 您能解释一下jsonb_array_elements 在where 条件下的作用吗?
      • 更新了答案。当您保存jsonb AS something 时,您可以从阵列中获得所需的内容。 postgresql.org/docs/current/static/…
      • 这里的the_array_key 是什么?
      • 无论数组存储在什么位置。例如,如果您有一个名为 posts 的表和一个名为 cmets 的列,那么它是 jsonb_array_elements(posts.comments),但如果您的数组嵌套在一个键中,那么它是 @987654330 @
      • 它提供了语法错误。您可以在答案中更新您的查询吗?
      猜你喜欢
      • 2018-07-26
      • 1970-01-01
      • 1970-01-01
      • 2019-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多