Dyanmi c Имя таблицы в запросе Postgres - PullRequest
2 голосов
/ 26 апреля 2020

Есть ли способ заменить имя таблицы в запросе значением, хранящимся в другой таблице? Это в postgres sql

Например

Meta_table

col1    | col 2
Table 1 | val1
Table 2 | val2

Мои требования

select * 
from (select col1 from meta_table where col2 = val2)

Ответы [ 3 ]

1 голос
/ 27 апреля 2020

Вероятно, наиболее гибким и эффективным способом является динамическое создание temporary view с использованием функции:

create or replace function f_prepare(tname text, vname text) returns text language plpgsql as $$
begin
    execute format(
        'create or replace temporary view %I as select * from %I',
        vname, tname);
    return vname;
end $$;

Затем вы можете использовать созданное представление обычным способом, например;

select f_prepare('pg_class', 'v_class');
select * from v_class where relname = 'pg_database'; -- Index on the source table will be used here

и используя ваш код:

select f_prepare((select col1 from meta_table where col2 = 'val2'), 'v');
select * from v;

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

0 голосов
/ 26 апреля 2020

Вы можете использовать Do оператор с cursor:

Попробуйте:

DO $$
DECLARE
  _query text;
  _cursor CONSTANT refcursor := '_cursor';
BEGIN
  _query := 'SELECT * FROM '|| (select col1 from meta_table where col2 = 'val1');
  OPEN _cursor FOR EXECUTE _query;
END
$$;

FETCH ALL FROM _cursor;
0 голосов
/ 26 апреля 2020

Если вы хотите изменить имя таблицы для таблицы, вы можете просто обновить столбец relname в таблице pg_class . Но для этого вам необходим административный доступ к Postgresql.

Запрос выглядит так: -

update pg_class set relname='new_table_name' where relname='old_table_name';

Итак, чтобы сделать это в одной строке, вы можете сделать так:

update pg_class set relname=(select col1 from meta_table where col2 = val2) where relname='old_table_name';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...