PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 22/08/2018 17:54:38

robinson
Membre

SELECT dynamique sur les Champs avec INFORMATION_SCHEMA.COLUMNS

Bonjour,

Je souhaiterai constituer une fonction dynamique (ou une requête simple) me permettant de récupérer les noms des champs d'une table pour les utiliser dans un SELECT. J'ai en effet une table avec un grand nombre de champs, en plus susceptibles de s'incrémenter et j'aimerai ne pas avoir à rajouter manuellement le nom des champs dans mes requêtes à chaque fois.

Je sais que l'on peut récupérer les noms des champs d'une table avec la requête :

 SELECT (SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='matable') ; 

Maintenant, j'aimerai concaténer tous les enregistrements du champs ainsi créé (et les formater sous le format 'nomcol1, nomcol2, nomcol3') pour pouvoir les appeler dans un select.
Pour faire un exemple, j'aimerai faire un

 SELECT (SELECT (SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='matable')) FROM matable 

Il me semble que c'est possible, vu que j'ai trouvé ce post :

SQLPro a écrit :

" Il faut construire votre requête en assemblant des bouts de chaines de caractères lus à partir des vues de métadonnées comme INFORMATION_SCHEMA.COLUMNS puis exécuter la chaine de caractères avec la commande EXECUTE."

https://www.developpez.net/forums/d1861 … ynamiques/


Mais la méthode n'est malheureusement pas détaillée et je n'ai pas trouvé de fonction sur les chaines de caractères adéquate.
Je vous remercie d'avance si vous avez des pistes pour m'aider.

Hors ligne

#2 22/08/2018 21:56:08

Marc Cousin
Membre

Re : SELECT dynamique sur les Champs avec INFORMATION_SCHEMA.COLUMNS

Vous pouvez commencer avec quelque chose de ce genre, pour expérimenter

CREATE OR REPLACE FUNCTION public.demo_cols()
 RETURNS void
 LANGUAGE plpgsql
AS $function$
DECLARE
        mycols varchar;
        myrecord record;
BEGIN
        SELECT string_agg(column_name,',') INTO mycols FROM information_schema.columns
        WHERE table_name = 'test' AND table_schema='public';
        EXECUTE 'SELECT ' || mycols || ' FROM test' LIMIT 1 INTO myrecord;
        RAISE NOTICE 'RECORD: %',myrecord;
END
$function$
;

Marc.

Hors ligne

Pied de page des forums