Подстановка строки с результатом запроса 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 '''

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

С наилучшими пожеланиями.

Другие вопросы по тегам