JSONB - подзапросы во встроенных данных - PullRequest
0 голосов
/ 26 мая 2020

Я использую PostgreSQL (v11.6), в котором есть таблица со столбцом JSONB , который содержит значение ниже. В столбце может быть несколько значений, т.е. могут быть идентификаторы от 1 до 100, например id: 1 -100, я показал только 2 записи в моем образце.

В настоящее время у меня есть запрос, который возвращает количество элементы для каждой строки в столбце, показанном ниже, который работает хорошо.

SELECT  jsonb_array_elements(my_column::jsonb) FROM my_table

Я хочу получить количество элементов, которые соответствуют определенному условию для каждой строки например, где selected не является нулевым, в этом примере ниже счетчик будет 1 . Я некоторое время исследовал это и не нашел способа solid установить фильтр. Совет оценен.

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

1 Ответ

1 голос
/ 26 мая 2020

Чтобы получить счетчик, вам понадобится подзапрос:

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

Если вы хотите проверить значения c, вы можете использовать:

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