Подстановка строки с результатом запроса postgresql
У меня есть запрос, который всегда будет возвращать только один элемент в результате. Я хочу добавить результат этого запроса в строку, которую я могу использовать для дальнейшей обработки
пример
select id from ids where some_condition
Я хочу добавить этот идентификатор в строку
лайк result_(id)_table
где id должен быть заменен идентификатором, возвращенным из предыдущего запроса (что существенно для другой таблицы)
и, наконец, я должен быть в состоянии выполнить запрос как
select * from result_id_table
Где "result_id_table" - это имя таблицы, в которой идентификатор подставлен соответствующим образом
2 ответа
Используйте конкатенацию строк:
-- Demo table structure
CREATE TABLE dummy ( id integer primary key, blah integer not null);
INSERT INTO dummy(id, blah) VALUES (1,1);
-- Single-valued query
SELECT id FROM dummy WHERE blah = 1;
-- Formatted with string concatenation
SELECT 'result_'||(id::text)||'_table' FROM dummy WHERE blah = 1;
-- Formatted using the `format` function
SELECT format('result_%s_table', id) FROM dummy WHERE blah = 1;
Объедините в строку, используя подзапрос, если вы собираете другую информацию
SELECT 'result_'||(SELECT id FROM dummy WHERE blah = 1)||'_table'
FROM .... WHERE ...
или используйте соединение.
Ваше редактирование предполагает, что вы хотите использовать его в качестве имени таблицы. Это, вероятно, означает, что ваш дизайн плохой. Вместо:
CREATE TABLE sometable_1 ( id integer primary key, ...);
CREATE TABLE sometable_2 ( id integer primary key, ...);
CREATE TABLE sometable_3 ( id integer primary key, ...);
...
CREATE TABLE sometable_n ( id integer primary key, ...);
вам почти всегда лучше с:
CREATE TABLE sometable(
id integer not null,
discriminator integer not null,
primary key (id, discriminator),
...
);
или таблицы по схеме. Если по какой-то причине вы застряли с этим подходом, вы можете использовать PL/PgSQL EXECUTE
оператор для запуска динамического SQL, например:
EXECUTE format('SELECT * FROM sometable_%s WHERE blah = ?',
quote_ident((SELECT id FROM dummy WHERE blah = 1))
)
USING 2;
запросить "sometable_1" для строк, где "blah = 2". Больше информации в руководстве см. EXECUTE ... USING
,
Это просто невозможно сделать в обычном SQL для PostgreSQL. Сделайте это в приложении или в PL/PgSQL. PL/PgSQL DO
Блок можно использовать, но производительность будет ужасной, если вы полагаетесь на это во всем.
Исправьте свой дизайн сейчас, пока не стало слишком поздно.
Я использую Postgre на Redshift, и я столкнулся с этой проблемой и нашел решение.
Я пытался создать динамический запрос, указав собственную дату.
date = dt.date(2018, 10, 30)
query = ''' select * from table where date >= ''' + str(my_date) + ''' order by date '''
Но запрос полностью игнорирует условие при его наборе таким образом.
Однако, если вы используете знак процента (%), вы можете правильно вставить дату.
Один правильный способ написать приведенное выше утверждение:
query = ''' select * from table where date >= ''' + ''' '%s' ''' % my_date + ''' order by date '''
Так что, может быть, это полезно, а может и нет. Надеюсь, это поможет хотя бы одному человеку в моей ситуации!
С наилучшими пожеланиями.