powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Найти общие элементы Массивов
7 сообщений из 7, страница 1 из 1
Найти общие элементы Массивов
    #39230438
Серджио
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет.
В постгресе без году неделя, поэтому спрашиваю.
Соблазнился мыслью о разграничении прав доступа через массивы. К примеру: имеем таблицу прав, у нее несколько отнаследованных дочек. Также есть таблица групп, где помимо стандартного id и названия группы находится массив прав. Вот как все это выглядит:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
CREATE TABLE rights (
    id SERIAL,
    name varchar( 50 ) NOT NULL,
    title varchar( 255 ),
    CONSTRAINT uniq_right_name UNIQUE( name )
);

CREATE TABLE rights_order (
) INHERITS ( rights );
INSERT INTO rights_order ( name, title ) VALUES ( 'orderAccess', 'Доступ к заявкам' );
INSERT INTO rights_order ( name, title ) VALUES ( 'orderAdd', 'Добавление заявки' );
INSERT INTO rights_order ( name, title ) VALUES ( 'orderEdit', 'Редактирование заявки' );
INSERT INTO rights_order ( name, title ) VALUES ( 'orderDel', 'Удаление заявки' );

CREATE TABLE rights_outerChat (
) INHERITS ( rights );
INSERT INTO rights_outerChat ( name, title ) VALUES ( 'outerChatAccess', 'Доступ к внешнему чату' );

CREATE TABLE groups (
    id SERIAL,
    title varchar( 255 ) NOT NULL,
    rights integer[]
);

INSERT INTO groups ( title, rights ) VALUES ( 'Операторы', '{1,5}' );



Чтобы получить массив прав на заявки нужно выполнить:
Код: plsql
1.
SELECT array( SELECT id FROM rights_order );


Массив прав группы получаем так:
Код: plsql
1.
SELECT rights FROM groups WHERE id = 1;



Но вот как получить массив общих элементов из 2 массивов ума не приложу.
Такой вариант:
Код: plsql
1.
SELECT ( SELECT array( SELECT id FROM rights_order ) ) && ( SELECT rights FROM groups WHERE id = 1 );


выведет t (true), но мне это не надо.
Лучше всего получить массив id. А еще лучше даже не массив, а список доступных прав (name). Вот как это сделать?
...
Рейтинг: 0 / 0
Найти общие элементы Массивов
    #39230441
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Серджио,

Массивы лепятся друг к другу оператором `||`, как строки.
...
Рейтинг: 0 / 0
Найти общие элементы Массивов
    #39230444
Серджио
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vyegorov, мне их склеивать не нужно вообще.
К примеру есть массив прав для доступа к архиву ( чтение, удаление, поиск и т.д. ) и есть массив прав группы или пользователя ( чтение новостей, возможность отвечать на форуме и т.д. ). То есть в массиве группы права могут быть вообще любыми.
Так вот: мне нужно найти в массиве прав группы или пользователя права, которые есть в правах архива и вывести их.
...
Рейтинг: 0 / 0
Найти общие элементы Массивов
    #39230513
Lonepsycho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Серджио,

Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT
  array_agg(ro.id) AS ids
FROM
  rights_order AS ro
  INNER JOIN
  groups AS g
  ON ro.id = ANY(g.rights)
...
Рейтинг: 0 / 0
Найти общие элементы Массивов
    #39230515
Lonepsycho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Серджио,

поправка
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT
  array_agg(ro.id) AS ids
FROM
  rights_order AS ro
  INNER JOIN
  groups AS g
  ON g.id = 1 AND -- забыл ид
       ro.id = ANY(g.rights)
...
Рейтинг: 0 / 0
Найти общие элементы Массивов
    #39230584
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Серджио,

Или поставьте
http://www.postgresql.org/docs/9.5/interactive/intarray.html
и используйте "int[] & int[] intersection of arrays"
или

select * from unnest(array1);
intersect all
select * from unnest(array2);

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
Найти общие элементы Массивов
    #39231375
Серджио
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lonepsycho, Maxim Boguk большущее спасибо.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Найти общие элементы Массивов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]