PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Dynamische SQL-Abfrage in Postgres

EXECUTE ... USING funktioniert nur in PL/PgSQL - dh innerhalb von Funktionen oder DO Blöcke, die in der Sprache PL/PgSQL geschrieben sind. Es funktioniert nicht in einfachem SQL; das EXECUTE in einfachem SQL ist völlig anders, um vorbereitete Anweisungen auszuführen. Sie können dynamisches SQL nicht direkt im SQL-Dialekt von PostgreSQL verwenden.

Vergleichen Sie:

  • PL/PgSQLs EXECUTE ... USING; zu
  • SQLs EXECUTE

Siehe den vorletzten Absatz in meiner vorherigen Antwort.

Abgesehen davon, dass Ihre SQL-Anweisung nicht ausgeführt wird, außer in PL/PgSQL, ist sie falsch, sie wird nicht das tun, was Sie erwarten. If (select id from ids where condition = some_condition) gibt beispielsweise 42 zurück , würde die Anweisung fehlschlagen, wenn id ist eine ganze Zahl. Wenn es in Text umgewandelt wird, erhalten Sie:

EXECUTE format('SELECT * from result_%s_table', quote_ident('42'));
EXECUTE format('SELECT * from result_%s_table', '"42"');
EXECUTE 'SELECT * from result_"42"_table';

Das ist ungültig. Sie wollen eigentlich result_42_table oder "result_42_table" . Sie müssten eher etwas schreiben wie:

EXECUTE format('SELECT * from %s', quote_ident('result_'||(select id from ids where condition = some_condition)||'_table'))

... wenn Sie quote_ident verwenden müssen .