Postgresql ВЫБРАТЬ ИЗ СТОЛ с помощью var - PullRequest
0 голосов
/ 04 марта 2020

У меня есть следующая структура SQL на Postgresql:

TABLE ei_1:

╔══════╦════════╦══════╗
║ id   ║ price  ║ vat  ║
╠══════╬════════╬══════╣
║ 1    ║ 10.0   ║ 0.20 ║
║ 2    ║ 15.0   ║ 0.20 ║
║ 3    ║ 20.0   ║ 0.20 ║
║ 4    ║ 25.0   ║ 0.20 ║
╚══════╩════════╩══════╝

TABLE ei_2

╔══════╦════════╦══════╗
║ id   ║ price  ║ vat  ║
╠══════╬════════╬══════╣
║ 1    ║ 35.0   ║ 0.20 ║
║ 2    ║ 40.0   ║ 0.20 ║
║ 3    ║ 45.0   ║ 0.20 ║
║ 4    ║ 50.0   ║ 0.20 ║
╚══════╩════════╩══════╝

ei_3, ei_4 .. . ei_x. Ссылка на x указана в другой таблице:

TABLE ei_info:

╔══════╗
║ id   ║
╠══════╣
║ 1    ║
║ 2    ║
║ 3    ║
║ 4    ║
╚══════╝

Как выбрать информацию из хорошего ei_x в соответствии с идентификатором в ei_info? Я видел людей, создающих временные таблицы, но не смог применить это к моему случаю.

Я пытаюсь сделать SELECT * FROM ei_x

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

Есть предложения?

Ответы [ 2 ]

1 голос
/ 04 марта 2020

Как многие люди говорили вам, это действительно плохая идея делать это таким образом, если вы не полностью понимаете, что делаете. Но если вы действительно хотите это сделать, вы можете написать функцию:

create function foo(table_index int)
  returns table (id int, price numeric, vat numeric) as $$
begin
  return query execute
    format('select id, price, vat from %I', 'ei_' || table_index::text);
end;
$$ language plpgsql;
0 голосов
/ 04 марта 2020

Разрабатывая мой комментарий, предполагая, что у вас 11 или выше, вы можете использовать собственное разбиение:

create table ei_x (
  id integer, 
  price numeric, 
  vat numeric, 
  x integer
) partition by list (x);

create table ei_1 partition of ei_x for values in (1);

create table ei_2 partition of ei_x for values in (2);

(and so on)

В этот момент вы все еще можете управлять отдельными таблицами, но запрос как этот:

select *
from ei_x
where x = 1

Будет сканироваться только таблица для соответствующих значений x.

Если вы используете более старую версию PostgreSQL, вы все равно можете использовать унаследованные таблицы и проверять ограничения для выполнения sh то же самое. Это просто больше работы.

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