Memorizza l'output della query di selezione in un array in postgres


88

Il mio codice è:

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

Restituisce i nomi delle colonne della tabella aean.
Ora ho dichiarato un array:

DECLARE colnames text[]

Come posso memorizzare l'output di select nell'array colnames.
C'è bisogno di inizializzare colnames?


+1, ho raggiunto qui con lo stesso identico messaggio di errore- ERRORE: impossibile trovare il tipo di array per il tipo di dati information_schema.sql_identifier. array_agg(column_name, ',')
Stavo

Risposte:


151

Ci sono due modi. Uno è aggregare:

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

L'altro è usare un costruttore di array:

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

Presumo che questo sia per plpgsql. In tal caso puoi assegnarlo in questo modo:

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

puoi darmi il codice che funziona su postgres perché questo non funziona su postgres ERRORE: impossibile trovare il tipo di array per il tipo di dati information_schema.sql_identifier
mitesh

Mi dispiace per quello. Le operazioni di copia e incolla senza pensieri hanno incluso array_agg () in tutte e tre le chiamate. Ho anche digitato quello iniziale per rendere felice la tua versione PG.
Denis de Bernardy

9
Per chiunque guardi oltre sulla parte plpgsql puoi DECLAREun array come my_array INTEGER[];(o qualunque sia il tipo pertinente). Puoi anche usare l'array in una WHEREclausola di query come WHERE values = ANY(my_array). Il ANYprende un array o un set e verificherà la presenza in quell'array / set, quindi funziona in modo equivalente IN ()in un certo senso
user2490003

11

Ho avuto esattamente lo stesso problema. Solo un'altra modifica funzionante della soluzione fornita da Denis (il tipo deve essere specificato):

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

1
Questo non sembra più essere il caso.
Soviut
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.