Как l oop над массивом, используя PostgreSQL JSON функции - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть база данных postgreSQL с таблицей entities со столбцом permissions типа jsonb. permissions - это массив разрешений. Каждое разрешение имеет массив principals и operation. Фактический JSON столбца permissions для конкретной сущности может выглядеть, например, следующим образом:

[
  {
    "principals": [
      "Administrators",
      "Users"
    ],
    "operation": "read"
  },
  {
    "principals": [
      "Administrators"
    ],
    "operation": "write"
  }
]

Теперь я хочу получить все сущности, которые имеют «Редакторы» или «Гости» читать "разрешение. Но единственный синтаксис, который я могу придумать, это приведенный ниже, где я запрашиваю только first разрешение (индекс = 0) сущностей:

SELECT * FROM entities WHERE permissions->0->'principals' ?| array['Editors', 'Guests'] and permissions->0->>'operation' = 'read'

Как изменить этот запрос содержать все разрешения организации?

1 Ответ

1 голос
/ 01 апреля 2020

Если я правильно понимаю, это может работать для вас:

select * from entities e
where exists(select 1 from jsonb_array_elements(e.permissions) r
        where (r->'principals' ?| array['Users', 'Editors']) and r->>'operation' = 'read')

С уважением,
Бьярни

...