Postgres 自定义 json 聚合函数

问题描述 投票:0回答:1

我发现自己多次写了这个选择的变体:

select coalesce(json_agg(distinct id), '[]'::json) as id_list from table

我想创建一个函数来让我写这个:

select distinct_list(id) as id_list from table

这样我就不必多次输入相同的内容。我查看了用户定义的聚合文档,看起来我必须定义自己的聚合函数来重新实现我不想做的合并/json_agg/distinct的所有功能。有更简单的方法吗?

sql json postgresql aggregate
1个回答
0
投票

下面的应该可以工作。它使用自定义处理程序状态函数 (sfunc),必须首先定义该函数。

CREATE OR REPLACE FUNCTION public.jsonb_aggs(d jsonb DEFAULT '[]'::jsonb, j TEXT DEFAULT NULL)
 RETURNS jsonb
 LANGUAGE plpgsql
AS $function$
BEGIN
    IF j IS NULL OR jsonb_build_array(j) <@ d THEN 
        RETURN d;
    ELSE
        RETURN d || jsonb_build_array(j);
    END IF;
END;
$function$
;

CREATE OR REPLACE AGGREGATE public.agg_test(TEXT) (
  SFUNC = 'jsonb_aggs',
  STYPE = jsonb,
  INITCOND = '[]'
);

使用 NULL 和重复项进行测试

WITH V AS (
SELECT NULL AS val UNION SELECT 'a' UNION SELECT 'b' UNION SELECT 'a'
)
SELECT public.agg_test(val) FROM V

产量

["b", "a"]

请注意,我在公共模式中创建了这些,但您需要将其更改为您的模式,以确保聚合可以在其路径上找到处理程序函数。

© www.soinside.com 2019 - 2024. All rights reserved.