Almacene la salida de la consulta de selección en una matriz en postgres

86

Mi codigo es:

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

Devuelve los nombres de columna de la tabla aean.
Ahora he declarado una matriz:

DECLARE colnames text[]

¿Cómo puedo almacenar la salida de select en la matriz colnames?
¿Es necesario inicializar colnames?

mitesh
fuente
+1, llegué aquí con exactamente el mismo mensaje de error: ERROR: no se pudo encontrar el tipo de matriz para el tipo de datos information_schema.sql_identifier. Estaba intentando conarray_agg(column_name, ',')
jerrymouse

Respuestas:

150

Hay dos maneras. Uno es agregar:

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

El otro es usar un constructor de matriz:

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

Supongo que esto es para plpgsql. En ese caso, puede asignarlo así:

colnames := ARRAY(
SELECT column_name
FROM information.schema.columns
WHERE table_name='aean'
);
Denis de Bernardy
fuente
¿Puede darme el código que funciona en postgres porque esto no funciona en postgres ERROR: no se pudo encontrar el tipo de matriz para el tipo de datos information_schema.sql_identifier
mitesh
Lo siento por eso. Copiar y pegar sin sentido tiene array_agg () incluido en las tres llamadas. También escribí a máquina la inicial para hacer feliz a tu versión PG.
Denis de Bernardy
9
Para cualquiera que busque más en la parte plpgsql, puede usar DECLAREuna matriz como my_array INTEGER[];(o cualquiera que sea el tipo relevante). También puede usar la matriz en una WHEREcláusula de consulta como WHERE values = ANY(my_array). La ANYtoma una matriz o un conjunto y comprobará la presencia en esa matriz / set, por lo que funciona de manera equivalente a IN ()en un sentido
user2490003
11

Tuve exactamente el mismo problema. Solo una modificación de trabajo más de la solución dada por Denis (se debe especificar el tipo):

SELECT ARRAY(
SELECT column_name::text
FROM information_schema.columns
WHERE table_name='aean'
)
ptski
fuente
1
Este ya no parece ser el caso.
Soviut