Armazene a saída da consulta selecionada em uma matriz no postgres


86

Meu código é:

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

Ele retorna os nomes das colunas da tabela aean.
Agora eu declarei uma matriz:

DECLARE colnames text[]

Como posso armazenar a saída do select na matriz colnames.
Existe alguma necessidade de inicializar colnames?


+1, cheguei aqui com exatamente a mesma mensagem de erro- ERRO: não foi possível encontrar o tipo de matriz para o tipo de dados information_schema.sql_identifier. Estava tentando comarray_agg(column_name, ',')
jerrymouse

Respostas:


150

Existem duas maneiras. Um é agregar:

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

A outra é usar um construtor de array:

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

Presumo que seja para plpgsql. Nesse caso, você pode atribuí-lo assim:

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

você pode me dar o código que funciona no postgres porque não está funcionando no postgres ERRO: não foi possível encontrar o tipo de array para o tipo de dados information_schema.sql_identifier
mitesh

Desculpa aí. Copiar e colar sem pensar tem array_agg () incluído em todas as três chamadas. Eu também digitei o inicial para deixar sua versão PG feliz.
Denis de Bernardy

9
Para quem procura mais na parte plpgsql, você pode usar DECLAREum array como my_array INTEGER[];(ou qualquer que seja o tipo relevante). Você também pode usar a matriz em uma WHEREcláusula de consulta como WHERE values = ANY(my_array). O ANYpega uma matriz ou conjunto e verifica a presença nessa matriz / conjunto, de modo que funciona de forma equivalente a, IN ()em certo sentido
user2490003

11

Eu tive exatamente o mesmo problema. Apenas mais uma modificação funcional da solução dada por Denis (o tipo deve ser especificado):

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

1
Este não parece mais ser o caso.
Soviut,
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.