PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

query sql dinamica in postgres

EXECUTE ... USING funziona solo in PL/PgSQL, cioè all'interno di funzioni o DO blocchi scritti nel linguaggio PL/PgSQL. Non funziona in semplice SQL; il EXECUTE in chiaro SQL è completamente diverso, per l'esecuzione di istruzioni preparate. Non puoi usare l'SQL dinamico direttamente nel dialetto SQL di PostgreSQL.

Confronta:

  • EXECUTE ... USING di PL/PgSQL; a
  • EXECUTE di SQL

Vedi il 2° ultimo par nella mia risposta precedente.

Oltre a non essere in esecuzione se non in PL/PgSQL, la tua istruzione SQL è sbagliata, non farà ciò che ti aspetti. Se (select id from ids where condition = some_condition) restituisce dire 42 , l'istruzione fallirebbe se id è un numero intero. Se viene trasmesso al messaggio di testo, otterrai:

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

Non è valido. In realtà vuoi result_42_table o "result_42_table" . Dovresti scrivere qualcosa di più come:

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

... se devi usare quote_ident .