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?


+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'
);

¿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'
)

1
Este ya no parece ser el caso.
Soviut
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.