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.