SQL-запрос для получения конфликтующих значений в JSONB из группы - PullRequest
0 голосов
/ 11 декабря 2018

У меня определена таблица, аналогичная приведенной ниже.location_id - это FK для другой таблицы.Отчеты сохраняются в формате N + 1: для одного места доступно N репортеров, и, если хотите, в качестве источника правды используется один отчет.Сообщения от репортеров имеют однобуквенный код (скажем, R), источник правды имеет другой код (скажем, T).Ключи для столбца JSONB - это обычные строки, значения - это любая комбинация строк, целых чисел и целых массивов.

create table report (
  id integer not null primary key,
  location_id integer not null,
  report_type char(1),
  data jsonb
)

Учитывая всю вышеприведенную информацию, как я могу получить все идентификаторы местоположений, где значения dataдля данного набора ключей (предоставляемых во время запроса) не все одинаковые для report_type R?

1 Ответ

0 голосов
/ 11 декабря 2018

Существует как минимум два надежных подхода, в зависимости от того, насколько сложным вы хотите получить и насколько многочисленны и / или динамичны ключи.Первая очень проста:

select location_id
from report
where report_type = 'R'
group by location_id
having count(distinct data->'key1') > 1 
  or count(distinct data->'key2') > 1
  or count(distinct data->'key3') > 1

Вторая конструкция более сложна, но имеет преимущество, заключающееся в предоставлении очень простого списка ключей:

--note that we also need distinct on location id to return one row per location
select distinct on(location_id) location_id
 --jsonb_each returns the key, value pairs with value in type JSON (or JSONB) so the value field can handle integers, text, arrays, etc 
from report, jsonb_each(data)
where report_type = 'R'
 and key in('key1', 'key2', 'key3')
group by location_id, key
having count(distinct value) > 1
order by location_id
...