Проектирование базы данных: выбор-запрос по параметрам функции - PullRequest
1 голос
/ 25 января 2012

Мне было интересно, возможно ли что-то подобное:

SELECT * FROM table1 
WHERE a1 = ... AND a2 = ... AND b1 = ... AND b2 = ...

Однако в действительности здесь происходит следующее: я вызываю функцию БД, например:

func1(a1,a2);

, который возвращает тип:

(b1,b2)

Итак, идея заключается в том, что с точки зрения конечного пользователя создается впечатление, что мы просто запрашиваем таблицу, как обычно, однако вызов функции и полученный выбор запроса скрыты от пользователя и выполняются позади. сцены.

Буду очень признателен за любую помощь, чтобы предложить возможный дизайн в БД, который мог бы выполнить это. (Например, table1 может быть какой-то виртуальной таблицей или представлением).

Ответы [ 3 ]

1 голос
/ 26 января 2012

Я не могу найти точный запрос, который вы получили.

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

например:

CREATE OR REPLACE FUNCTION myfun(a1 INT, a2 INT)
RETURNS TABLE (b1 int, b2 int)
AS
$$
BEGIN
   RETURN QUERY (SELECT a1+a2 AS b1, a1*a2 AS b2);
END;
$$
LANGUAGE plpgsql;

, что позволяет нам звонить

select * from myfun(4,5);

b1   b2
---- ----
9    20

Я взглянул на систему Postgresql Rule , которая могла бы переписать запрос и переместить параметры из предложения where в вызов функции, но я не смог найти способ.

0 голосов
/ 25 января 2012

Хранимые процедуры в большинстве баз данных могут возвращать набор строк.

С этой целью хранимая функция в PostgreSQL может вернуть курсор (см. Раздел «Возвращение курсоров»).

0 голосов
/ 25 января 2012

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

В SQL Server вы пишете Табличную функцию (TVF).

PostgreSQL также поддерживает .

Вы оценили бы a1 и b1 в самой функции. Внешний выбор будет касаться только b1 и b2 в предложении WHERE.

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