Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
#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 :
" 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