我正在尝试对聚合函数进行编码,以便在存储为bytea的表的列之间执行bit_和beet。 用于执行此操作的函数使用二进制字符串的长度对bytea进行子串 %8(字节长度)并返回bit和satetfy所有bytea部分之间的位:
部分& binary_string = binary_string
我定义了聚合“testaggregate”来聚合来自查询的所有值,如
select testaggregate (bytea_field, binary_string_in_varchar)
from tab1
这是汇总代码
create aggregate testaggregate (bytea, character varying) (
sfunc =aggand($0, $1, $2),
stype = bit varying<p>
);
其中aggand是:
declare
ret bit varying;
begin
if suband($2,$3) is not null then
if $1 is null then ret = suband($2,$3);
else
ret =$1 & suband($2,$3);
end if;
else
ret =null;
end if;
return ret ;
end;
和“suband”是计算每行的bit_and的函数。
我的第一个问题是,当我执行聚合函数时,它不会返回单行,而是返回与表一样多的行。 第二个问题也是最重要的是为什么聚合内部状态在执行aggand后总是为空。
对不起我的英文和代码的不良缩进这是我的第一个问题。感谢所有
答案 0 :(得分:1)
看起来调用状态函数而不是聚合,但有一些错误的聚合定义
CREATE OR REPLACE FUNCTION s_func(int, int, int)
RETURNS int AS $$
BEGIN
RETURN $1 + COALESCE($2,0) + COALESCE($3,0);
END
$$ LANGUAGE plpgsql;
CREATE AGGREGATE sgg(int, int) (sfunc = s_func, stype = int, INITCOND = 0);
postgres=# SELECT sgg(i, i+1) FROM generate_series(1,3) g(i);
sgg
-----
15
(1 row)