Eu tenho uma função agg que soma decimais. Lógica de negócios omitida por questões de brevidade
CREATE OR REPLACE FUNCTION calculate_snapshot_internal_decimal(_this_value DECIMAL,
_next_value DECIMAL
OUT _code DECIMAL)
LANGUAGE plpgsql AS
$func$
BEGIN
_code = _this_value + _next_value;
END
$func$;
Agora preciso do mesmo para JSONB onde a chave é string e o valor é sempre BigDecimal
_este_valor:
{"weight": "50", "height":"170", "size": "2"}
_próximo_valor
{"weight": "40", "height":"20"}
resultado agregado:
{"weight": "90", "height":"190", "size": "2"}
O que eu poderia tentar?
Você pode desaninhar com
jsonb_each_text()
,UNION ALL
, converter, resumir e depois agregar novamente comjsonb_object_agg()
:Chamar:
violino
Isso soma todos os valores por chave nos dois
jsonb
documentos de entrada. Valores que não são compatíveis comnumeric
( =decimal
) geram uma exceção.Não precisamos de PL/pgSQL para isso. SQL simples faz isso. Eu escolhi a variante SQL padrão. Ver:
Esta não é uma "função agregada" , estritamente falando, e nem o exemplo da pergunta. Ambas são funções simples que agregam dois valores de entrada.