我发现自己多次写了这个选择的变体:
select coalesce(json_agg(distinct id), '[]'::json) as id_list from table
我想创建一个函数来让我写这个:
select distinct_list(id) as id_list from table
这样我就不必多次输入相同的内容。我查看了用户定义的聚合文档,看起来我必须定义自己的聚合函数来重新实现我不想做的合并/json_agg/distinct的所有功能。有更简单的方法吗?
下面的应该可以工作。它使用自定义处理程序状态函数 (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"]
请注意,我在公共模式中创建了这些,但您需要将其更改为您的模式,以确保聚合可以在其路径上找到处理程序函数。