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

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



и таблица в которой хранятся фильтры к продуктам

Код: plsql
1.
2.
3.
4.
5.
6.
CREATE TABLE Filters (
    productId UUID NOT NULL,
    filter JSONB NOT NULL,
    sqlQuery VARCHAR(2096) NOT NULL,
    FOREIGN KEY(productId) REFERENCES Products(productId) ON DELETE CASCADE ON UPDATE CASCADE
);



поле sqlQuery хранит sql запрос для выборки продуктов, который представляет собой что-то вроде
Код: plsql
1.
select * from Products where какое-то сложное условие.


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

Что не получается: попытался решить задачу одним динамическим запросом

Код: plsql
1.
2.
3.
4.
select * from Filters
    where exists (
        /*Вот тут хотелось бы обратиться к полю Filters.sqlQuery и выполнить его как запрос*/
    );



Но собственно не знаю как сделать то, что описано в комментарии запроса выше.
...
Рейтинг: 0 / 0
Как прочитать строку из БД и выполнить как запрос?
    #40136501
Swa111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Bakuard,

Читаем тут . Думаю идея будет понятна, адаптируете под свои задачи.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
Create function GetProduct (idpProduct uuid) return product language plpgsql $body$
begin
  return query execute format('select * from product where productId = %s %s', idpProduct , (select sqlQuery from Filters  where productId  = idpProduct);
end;

$body$;

Select t.* from GetProduct('4f847231-7190-4cc7-9fba-ce6c7e9f167f') as t;
...
Рейтинг: 0 / 0
Как прочитать строку из БД и выполнить как запрос?
    #40136502
Bakuard
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Swa111, спасибо за ответ. Воспользовался вашим советом и попытался решить эту задачу через процедуру:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE OR REPLACE FUNCTION existProductsForFilter(productCategories VARCHAR(256)[], filterQuery VARCHAR(2096))
    RETURNS BOOLEAN
    AS $$
BEGIN
    RETURN EXISTS (
        SELECT * FROM (EXECUTE filterQuery) AS P
            WHERE P.category = ANY(productCategories)
    );
END;
$$ LANGUAGE plpgsql;



Но при попытке её создать вылазит ошибка:
авторERROR: ОШИБКА: ошибка синтаксиса (примерное положение: ")")
LINE 6: SELECT * FROM (EXECUTE filterQuery) AS P

Подскажите пожалуйста, в чем может быть причина этой ошибки (я безуспешно пытался это нагуглить).
...
Рейтинг: 0 / 0
Как прочитать строку из БД и выполнить как запрос?
    #40136523
Swa111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Bakuard,

Нет, Вы не правильно поняли.

Суть в том что Вам нужно сначала сформировать запрос в виде строки а затем выполнить его. т.е. по факту два запроса, первый получает критерий второй уже продуктивный.

Покажите несколько реальных вариантов из таблиц, что бы понять что пытаетесь получить
...
Рейтинг: 0 / 0
Как прочитать строку из БД и выполнить как запрос?
    #40136573
Bakuard
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Swa111, ещё раз спасибо за помощь. Вот несколько реальных вариантов:

В таблице Products лежат следующие строки:
('00000000-0000-0000-0000-000000000001', 'помидор', 250.56, 'Пяторочка')
('00000000-0000-0000-0000-000000000002', 'картофель', 80.56, 'Globus')
('00000000-0000-0000-0000-000000000003', 'Кефир', 70.56, 'Пяторочка')

Насчет таблицы Filters, я опустил все поля, которые не связаны с вопросом.
Код: plsql
1.
2.
3.
CREATE TABLE Filters (
    sqlQuery VARCHAR(2096) NOT NULL,
);


В этой таблице лежат такие строки:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
    
select * from Products
   where 
       (name in ('помидор', 'картофель', 'мука') 
        and shop in ('Globus'))
       or
       (shop not in ('Москва 24'))



Код: plsql
1.
2.
3.
    
select * from Products
   where shop in ('Москва 24')



Необходимо вытащить все строки из таблицы Filters, которым соответствует хотя бы один продукт поле name которого содержится в указанном массиве: ('картофель', 'мука', 'яблоки')

Ожидаемый результат: первая строка (в порядке, котором я их перечислил) из таблицы Filter
...
Рейтинг: 0 / 0
Как прочитать строку из БД и выполнить как запрос?
    #40136613
Swa111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Bakuard,

Все равно не очень понятно

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Create function GetProductWithFilter () return product language plpgsql $body$
declare 
  x record;
begin
  for x in (select sqlQuery from Filters) loop
    return query execute x.sqlQuery;
  end loop;
  return;
end;
$body$;


select * from GetProductWithFilter () where name in ('картофель', 'мука', 'яблоки');



Если это поможет то советую пересмотреть архитектуру
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как прочитать строку из БД и выполнить как запрос?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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