postgresql: фильтр в массиве JSON - PullRequest
0 голосов
/ 03 декабря 2018

Допустим, у нас есть таблица items, в которой есть столбцы name и attributes:

CREATE TABLE students (
  name VARCHAR(100),
  attributes JSON
)

, где атрибуты - это массив (всегда одинаково структурированных) документов JSON, таких как

[{"name":"Attribute 1","value":"Value 1"},{"name":"Attribute 2","value":"Value 2"}]

Теперь я хочу найти всех учеников, где какое-либо значение атрибута соответствует чему-либо (например, Foo%). Вот пример игровой площадки .

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

1 Ответ

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

Вы можете использовать json_array_elements для доступа к элементам, а затем использовать оператор - >> json для поиска по некоторому значению.

select s.*,j from 
  students  s 
   cross join lateral json_array_elements ( attributes ) as j
WHERE j->>'value' like 'Foo%'

Демо

Редактировать

Проблема здесь заключается в том, что перекрестное соединение "дублирует" строки.Есть ли лучший способ избежать этого

использовать WITH ORDINALITY для создания идентификатора для каждого элемента и затем использовать DISTINCT ON для получения первого / последнего совпадения для каждого студента.

select DISTINCT ON (name) s.*,j.attr from 
students  s 
cross join lateral json_array_elements ( attributes ) WITH ORDINALITY as j(attr,id)
WHERE j.attr->>'value' like 'Value%'
ORDER BY name,j.id

Demo2

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