118 votes

Stocker la sortie de la requête de sélection dans un tableau dans postgres

Mon code est :

SELECT column_name
FROM information.SCHEMA.columns
WHERE table_name = 'aean'

Il retourne les noms des colonnes de la table aean .
Maintenant, j'ai déclaré un tableau :

DECLARE colnames text[]

Comment puis-je stocker la sortie de la sélection dans le tableau colnames.
Est-il nécessaire d'initialiser les noms de colonnes ?

0 votes

+1, je suis arrivé ici avec exactement le même message d'erreur- ERROR : could not find array type for data type information_schema.sql_identifier. J'ai essayé avec array_agg(column_name, ',')

197voto

Denis Points 34131

Il y a deux façons de procéder. L'une est d'agréger :

SELECT array_agg(column_name::TEXT)
FROM information.schema.columns
WHERE table_name = 'aean'

L'autre solution consiste à utiliser un constructeur de tableau :

SELECT ARRAY(
SELECT column_name 
FROM information.schema.columns 
WHERE table_name = 'aean')

Je suppose que c'est pour plpgsql. Dans ce cas, vous pouvez l'assigner comme ceci :

colnames := ARRAY(
SELECT column_name
FROM information.schema.columns
WHERE table_name='aean'
);

0 votes

Pouvez-vous me donner le code qui fonctionne sur postgres car ceci ne fonctionne pas sur postgres ERROR : could not find array type for data type information_schema.sql_identifier

0 votes

Désolé pour ça. Un copier-coller inconscient a inclus array_agg() dans les trois appels. J'ai aussi tapé l'appel initial pour rendre votre version PG heureuse.

14 votes

Pour ceux qui cherchent plus loin sur la partie plpgsql, vous pouvez DECLARE un tableau comme my_array INTEGER[]; (ou tout autre type pertinent). Vous pouvez également utiliser le tableau dans la requête WHERE comme WHERE values = ANY(my_array) . Le site ANY prend un tableau ou un ensemble et vérifie la présence dans ce tableau/ensemble, de sorte qu'il fonctionne de manière équivalente à IN () en un sens

16voto

ptski Points 159

J'ai eu exactement le même problème. Encore une modification fonctionnelle de la solution donnée par Denis (le type doit être spécifié) :

SELECT ARRAY(
SELECT column_name::text
FROM information_schema.columns
WHERE table_name='aean'
)

2 votes

Cela ne semble plus être le cas.

1voto

L'utilisation du type de données "TEXT" permettra à vos requêtes de s'exécuter sans problème. En plpgsql, lorsque nous assignons à une variable de type tableau, nous n'avons pas besoin d'utiliser le casting de type. Mon besoin était d'obtenir un CSV de tous les noms de colonnes d'une table particulière. J'avais utilisé le code suivant dans plpgsql.

Declare col_list varchar[]:=NULL;
cols varchar:=NULL;
Begin
    col_list := ARRAY(select t.name from frm_columns t where t.tname='emp_mstr');
    cols := array_to_string(col_list,',');
    return cols;
End;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X