powered by simpleCommunicator - 2.0.18     © 2024 Programmizd 02
Map
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Хранение и получение фильтров в БД
2 сообщений из 2, страница 1 из 1
Хранение и получение фильтров в БД
    #40136046
Bakuard
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Задача: имеется таблица продуктов

Код: plsql
1.
2.
3.
4.
5.
6.
CREATE TABLE Products (
    id UUID NOT NULL,
    name VARCHAR(256) NOT NULL,
    shop VARCHAR(256) NOT NULL,
    PRIMARY KEY(id)
);



Нужно определить - как хранить фильтры к этим продуктам в БД с учетом следующего:

Первое условие - фильтры бывают следующие:
1. фильтр продуктов по полю name - допускаются только те продукты, наименования которых встречаются в заданном массиве строк.
2. фильтр продуктов по полю shop - допускаются только те продукты, магазины которых встречаются в заданном массиве строк.
3. фильтры в пунктах 1 и 2 можно комбинировать с применением булевых операций И, ИЛИ, НЕ.

Второе условие - иногда для фильтров нужно будет выполнять такой запрос:
Задается массив с наименованиями продуктов. Нужно найти все фильтры, которым соответствует хотя бы один продукт, наименование которого встречается в заданном массиве.

Что не получается: т.к. фильтры могут представлять собой сложное логическое выражение, то я решил представить их в виде дерева - где узлами являются логические операции, а листьями фильтры типов 1 и 2. Я посчитал, что для хранения иерархической структуры хорошо подойдет тип JSONB. Собственно с сохранением фильтров у меня проблем не возникло. Однако с таким подходом я не могу понять, как построить описанный в задаче запрос.
...
Рейтинг: 0 / 0
Хранение и получение фильтров в БД
    #40136329
bochkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
table filter(
id int,
names  varchar[],
shop varchar,
andoper boolean not null default true) 



Код: sql
1.
2.
3.
select * from products p
join filter f on f.id=1 and  case when andoper then (f.shop is null or p.shop=f.shop) and (f.names is null or p.names in (f.names))
else  (f.shop is null or p.shop=f.shop) or (f.names is null or p.names in (f.names)) end
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Хранение и получение фильтров в БД
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (1): Анонимы (1)
Читали форум (1): Анонимы (1)
Пользователи онлайн (8): Анонимы (5), Google Bot, Yandex Bot 1 мин., Bing Bot 2 мин.
x
x
Закрыть


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