A função string_agg(expr, delimitador) do Postgres é ótima. Mas eu gostaria de ter uma versão que levasse um único argumento -- o campo para agregar -- e assumisse um delimitador de ', ' já que é o que eu quero 9 vezes em 10. Com uma função não agregada, eu poderia simplesmente faça isso:
create or replace function public.string_agg(text)
returns text
as $$
select string_agg($1, ', ');
$$ language sql
immutable;
Mas como string_agg é uma função agregada, isso não funciona. Ele reclama que o campo que estou passando para ele precisa estar na cláusula GROUP BY, o que me diz que o mecanismo de consulta não entende que meu wrapper é uma função agregada.
Eu olhei os documentos para agregados definidos pelo usuário (http://www.postgresql.org/docs/9.1/static/xaggr.html e http://www.postgresql.org/docs/9.1/static/sql-createaggregate .html ), mas não é óbvio para mim como eu poderia definir meu novo string_agg(text) usando o string_agg(text, text) existente. Parece que eu teria que definir minha nova função do zero, que é mais complexa do que eu quero assumir, e também não estou totalmente confiante de que poderia espelhar perfeitamente o comportamento do string_agg integrado.
Então, existe alguma técnica para criar um wrapper simples que não estou vendo? Ou vou ter que fazer mais trabalho?
Pelo que sei, você não pode agrupar uma função agregada. Você tem que escrever sua própria função agregada.
Se você escrever sua própria função, poderá encontrar incompatibilidades ao atualizar ou portar para outro banco de dados. Então, pessoalmente, eu não me incomodaria e apenas adicionaria o delimitador a
string_agg()
cada chamada. Realmente não é tão doloroso.Dito isso, não é tão complicado escrever sua própria função de agregação:
Uma função final personalizada :
O agregado:
Ligar:
Funciona para quase qualquer tipo - exceto para tipos de array. Você teria que modificar seu agregado para isso. Mais nesta resposta intimamente relacionada em SO .