quinta-feira, 16 de setembro de 2010

Como obter uma coluna que tenha todo o resultado de um SUBSELECT concatenado com vírgulas

Imagine a seguinte saida de um SELECT:

Cod Banco Cod. das Agências
001 Banco do Brasil 03996,34096,03816
104 Caixa Economica Federal 12212,03996
237 Bradesco 00833
422 Sicredi 0153, 0300, 0500

Pergunto: Como obter a coluna com os Códigos das Agências concatenados e separados por virgula?

1ª solução “na base da força bruta”:

SELECT B.CODIGO,
       B.NOME,
       COALESCE((SELECT AGENCIA FROM AGENCIA A WHERE A.BANCO = B.CODIGO LIMIT 1),'') ||
       COALESCE(',' || (SELECT AGENCIA FROM AGENCIA A WHERE A.BANCO = B.CODIGO LIMIT 1 OFFSET 1), '') ||
       COALESCE(',' || (SELECT AGENCIA FROM AGENCIA A WHERE A.BANCO = B.CODIGO LIMIT 1 OFFSET 2), '') ||
       COALESCE(',' || (SELECT AGENCIA FROM AGENCIA A WHERE A.BANCO = B.CODIGO LIMIT 1 OFFSET 3), '')       
  FROM BANCO B
  ORDER BY 1,3


Até que a solução acima funciona, porém pouco eficiente, e com limitações, no caso limitado a 4 agências.



2ª solução  “o ideal”:



SELECT B.Codigo, 
       B.Nome, 
       ARRAY_TO_STRING(Array(
             SELECT A.Agencia::VARCHAR 
               FROM Agencia A
              WHERE A.Banco = B.Codigo
            ),',') AS Agencias
  FROM Banco B


Agora sim, temos uma solução mais eficiente, e sem limite de agências.