首页 > 解决方案 > JSONB - 嵌入数据中的子查询

问题描述

我正在使用 PostgreSQL (v11.6),它有一个包含以下值的JSONB列的表。列中可以有多个值,即可以有从 1 到 100 的 ID,例如 id:1 -100,我在示例中只显示了 2 个条目。

我目前有一个查询,它返回下面显示的列中每一行的元素数,效果很好。

SELECT  jsonb_array_elements(my_column::jsonb) FROM my_table

我想获取每行满足特定条件的元素的数量,例如,其中 selected 不为 null,在此示例中,计数下方为 1。我已经对此进行了一段时间的研究,但还没有找到一种可靠的方法来安装过滤器。建议表示赞赏。

[
  {
    "id": 1,
    "choices": [
      {
        "id": 100,
        "misc_data": [
          {
            "id": 1000
          },
          {
            "id": 1002
          }
        ]
      }
    ],
    **"chosen": 2**
  },
  {
    "id": 2,
    "choices": [
      {
        "id": 200,
        "misc_data": [
          {
            "id": 2002
          },
          {
            "id": 2050
          }
        ]
      }
    ]
  }
]

标签: postgresqljsonb

解决方案


您需要一个子查询来获取计数:

select ..., (select count(*)
             from jsonb_array_elements(the_column) as x(e)
             where x.e ? 'chosen') as chosen_count
from the_table

如果要检查特定值,可以使用:

select ..., (select count(*)
             from jsonb_array_elements(the_column) as x(e)
             where (x.e ->> 'chosen')::int > 0) as chosen_count
from the_table

推荐阅读