0

我正在尝试编写一个聚合函数来执行 bit_and beetween 存储为 bytea 的表的列。该函数用于使用二进制字符串 % 8 (字节长度)的长度对 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执行后聚合内部状态总是为null。

对不起我的英语和代码缩进不好这是我的第一个问题。谢谢大家

4

1 回答 1

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)
于 2013-10-29T13:24:37.103 回答