Vertical para a horizontal?

votos
1

Eu tenho uma tabela PostgreSQL que se parece com isso:

A -> B
A -> C
A -> G
A -> H
B -> O
B -> K

Onde -> separa duas colunas onde os primeiros pontos para o segundo (hiperlinks). Agora eu gostaria de ter todos os valores distintos na primeira coluna e atribuir-lhes um array contendo todos os valores aos quais eles apontam para na segunda coluna, reduzindo assim o tamanho do índice e me ajudar a chegar mais perto de onde eu gostaria de obter.

Por isso, quero ARRAYify um único conjunto de resultados de colunas de [muitos] linhas. Se eu pudesse chamar uma função como arrayify(SELECT column2 FROM table WHERE column1 = 'A') que faria a minha vida tão fácil.

Qualquer pessoa ou anymany sabe?

THX

Publicado 10/01/2009 em 23:29
fonte usuário
Em outras línguas...                            


1 respostas

votos
1

Depende de qual versão do PostgreSQL você está usando. Se você estiver usando versões recentes (qualquer coisa suportado no momento), você pode usararray_agg(col)

Por exemplo:

select array_agg(test) from test;
                                       array_agg                                

--------------------------------------------------------------------------------
-------
 {4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,
32,33}
(1 row)

Se você estiver usando uma versão mais antiga, pode ser necessário para escrever seu próprio agregado array_agg ou workalike. Aqui está uma maneira de escrever um chamado "as_array":

CREATE AGGREGATE as_array (
        BASETYPE = ANYELEMENT,
        STYPE = ANYARRAY,
        SFUNC = ARRAY_APPEND,
        INITCOND = '{}'
);
Respondeu 17/03/2013 em 03:18
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more