Postgresql: выбор таблиц, в которых имена таблиц хранятся в виде содержимого в другой таблице - PullRequest
0 голосов
/ 07 января 2019

У меня есть таблица, которая содержит имена таблиц (имя столбца - имя таблицы - 1000 строк). Я хочу пройтись по этой таблице, создавая оператор выбора для доступа к данным внутри каждой таблицы. Я могу без проблем просматривать таблицу, но не могу найти способ вставить содержимое (фактическое имя таблицы) в оператор выбора.

...
hold_tablename = a_rec.tablename;
query1 := 'SELECT * FROM hold_tablename'; 
--  Postgres thinks 'hold_tablename' is the name of the table rather than
-- looking into the content of that field which should be aaa_customer_tbl.

<<innerloop>> 
FOR b_rec IN EXECUTE query1
loop
   select * from b_rec;
end loop innerloop;

1 Ответ

0 голосов
/ 07 января 2019

Самый простой способ интерполировать идентификатор в строку - это использовать format со спецификатором %I:

query1 := format('SELECT * FROM %I', hold_tablename);

Это позаботится о правильном цитировании hold_tablename, если оно чувствительно к регистру или содержит пробелы или другие проблемные символы.

В качестве альтернативы вы можете использовать quote_ident и конкатенацию строк:

query1 := 'SELECT * FROM ' || quote_ident(hold_tablename);

но format менее шумный.

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