tin*_*lyx 6 postgresql aggregate array
我正在尝试编写一个 PostgreSQL array_agg() 变体,它返回空数组'{}'
而不是 NULL。为了避免自定义聚合函数对性能的影响CREATE AGGRGATE
,我尝试重新使用内置的array_agg_transfn
和array_agg_finalfn
。从文档中的代码示例开始,类似于 array_agg 的初始版本可以工作(作为数据库超级用户):
CREATE AGGREGATE array_agg_z (anynonarray)
(
sfunc = array_agg_transfn,
stype = internal,
finalfunc = array_agg_finalfn,
finalfunc_extra
);
Run Code Online (Sandbox Code Playgroud)
它按预期在空输入上返回 NULL:
=> SELECT array_agg_z(i) IS NULL FROM (SELECT 0 WHERE 1 = 2) t(i);
?column?
----------
t
(1 row)
Run Code Online (Sandbox Code Playgroud)
现在,要更改array_agg_z()
为在空输入上返回空数组,我尝试将其设置initcond
为'{}'
如下:
CREATE AGGREGATE array_agg_z (anynonarray)
(
sfunc = array_agg_transfn,
stype = internal,
finalfunc = array_agg_finalfn,
initcond = '{}',
finalfunc_extra
);
Run Code Online (Sandbox Code Playgroud)
现在它给出了一个错误:
=> SELECT array_agg_z(i) IS NULL FROM (SELECT 0 WHERE 1 = 2) t(i);
ERROR: cannot accept a value of type internal
Run Code Online (Sandbox Code Playgroud)
如何解决这个问题?
或者我是否必须破解相关的 C 源代码才能array_agg()
制作此变体?
顺便说一句,这是 PostgreSQL 12 的情况。
归档时间: |
|
查看次数: |
11776 次 |
最近记录: |