Для этого вы можете использовать табличную функцию.Создайте функцию, которая принимает аргумент и в зависимости от этого аргумента запрашивает a.persons
или b.persons
.
Пример:
CREATE TYPE schema_switch AS ENUM ('a', 'b');
CREATE OR REPLACE FUNCTION dynamic_view (_schema schema_switch)
RETURNS TABLE (name text)
AS
$$
DECLARE
x INT;
BEGIN
CASE
WHEN _schema ='a'
THEN RETURN QUERY SELECT persons.name
FROM a.persons;
WHEN _schema ='b'
THEN RETURN QUERY SELECT persons.name
FROM b.persons;
END CASE;
END;
$$
LANGUAGE plpgsql;
Вызванный как dynamic_view('a')
вернет записи изa.persons
, dynamic_view('b')
те из b.persons
.
В этом примере я создал новый тип перечисления, который позволяет только 'a'
или 'b'
для ввода.Это делает его менее подверженным ошибкам.Но вы, конечно, могли бы также сделать это с varchar
и RAISE
ошибкой, если было передано недопустимое значение.Вы также можете использовать динамический SQL, чтобы разрешить передачу произвольного имени схемы, используя RETURN QUERY EXECUTE
.Но не забудьте проверить правильность ввода. Затем посмотрите pg_catalog.pg_namespace
, если такая схема существует.
Возможно, есть также возможность сделать это с rules вместо функции.