PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

requête sql dynamique dans postgres

EXECUTE ... USING ne fonctionne qu'en PL/PgSQL - c'est-à-dire dans les fonctions ou DO blocs écrits dans le langage PL/PgSQL. Cela ne fonctionne pas en SQL ordinaire ; le EXECUTE en SQL brut est complètement différent, pour l'exécution d'instructions préparées. Vous ne pouvez pas utiliser SQL dynamique directement dans le dialecte SQL de PostgreSQL.

Comparez :

  • EXECUTE ... USING de PL/PgSQL; à
  • EXECUTE de SQL

Voir le 2ème dernier par dans ma réponse précédente.

En plus de ne pas fonctionner sauf en PL/PgSQL, votre instruction SQL est erronée, elle ne fera pas ce que vous attendez. Si (select id from ids where condition = some_condition) renvoie par exemple 42 , l'instruction échouerait si id est un entier. S'il est converti en texte, vous obtiendrez :

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

C'est invalide. Vous voulez réellement result_42_table ou "result_42_table" . Vous devriez écrire quelque chose comme :

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

... si vous devez utiliser quote_ident .