Фильтрация по внутренним ключам JSON, хранящимся в таблице PostgreSQL - PullRequest
0 голосов
/ 07 мая 2018

У меня есть отчет в формате 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 ключей на первом уровне ( разделы ), каждый из которых является объектом с набором ключей ( tests ), с исход и набор переменных результаты в виде (key, value) пар.

Мне нужно выполнить фильтрацию на основе внутренних ключей JSON. Более конкретно, в этом примере я хочу знать, возможно ли, используя только SQL, получить элементы, которые имеют, например, значение std в разделе results выше определенного порога, скажем 10. Я даже могу знать, что std находится в test2, но я не знаю a priori , в каком разделе. Например, с этим фильтром (test2.std > 10.) появится запись с примерами данных, показанными выше, поскольку переменная std в тесте test2 имеет это значение, равное 21. (> 10.).

Другим, более простым фильтром может быть запрос всех записей, для которых test2.outcome не nominal.

1 Ответ

0 голосов
/ 07 мая 2018

В одну сторону 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

Пример в SQL Fiddle.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...