Подзапрос Postgres в предложении FROM - PullRequest
0 голосов
/ 23 марта 2019

В Postgres я использую подзапрос в предложении FROM, но не знаю, как получить желаемый результат. Скажем, у меня есть 2 таблицы, tableNameRegister(idNum integer, tableName text) и mytable(comment text, orderVal integer). tableNameRegister будет выглядеть примерно так:

 idnum | tablename
-------+------------
     1 | mytable
     2 | othertable

И mytable будет выглядеть примерно так:

  comment  | orderval
-----------+-------
 comment 1 |     1
 comment 2 |     2

Я хочу взять значение tableName из tableNameRegister и выбрать из этого значения tableName, но все в одном запросе. По сути, как-то так:

tabName = 'SELECT tableName FROM tableNameRegister WHERE idNum = 1;'
'SELECT * FROM ${tabName} WHERE orderVal = 2'

В идеале это вернет строку, содержащую comment 2. Поэтому я попытался сделать это в подзапросе:

'SELECT * FROM (SELECT tableName FROM tableNameRegister WHERE idNum = 1) AS tabname WHERE orderVal = 2;'

Но узнал, но это не работает так, как я думал. По сути, он возвращает своего рода подтаблицу, основанную на результатах подзапроса, а не фактическое значение mytable, которое я хочу. Мне было интересно, если есть способ сделать то, что я хотел, все в одном запросе / с использованием подзапросов? Или это то, что я должен был бы сделать программно и разделить на два запроса?

1 Ответ

1 голос
/ 23 марта 2019

Этот тип вещи лучше всего делать с помощью сценариев или программным способом.С чем-то вроде plpgsql у нас больше гибкости, но даже при этом сложнее будет, если все таблицы не будут иметь одинаковую структуру или хотя бы общие имена столбцов.Если бы они делали или могли быть каким-то образом абстрагированы, вы могли бы начать что-то вроде следующего:

CREATE OR REPLACE FUNCTION tablequery(id_num int)
RETURNS TABLE (comment varchar, orderval int)
AS $$
DECLARE
tableName varchar(50);
BEGIN
SELECT table_name FROM tableNameRegister WHERE idnum = id_num LIMIT 1 into tableName;
  RETURN QUERY EXECUTE format('SELECT * FROM %I WHERE orderVal = 2;', tableName);
END;
$$ LANGUAGE plpgsql;

select * FROM tableQuery(1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...