我使用此代码定义了operator =:
create operator = (leftarg = point, rightarg = point, procedure = point_eq, commutator = =);
但是下面的代码仍然无法正常工作并引发错误,如标题,出了什么问题?
create or replace function skyband_get(dataset text, k integer)
returns point[]
as $$
declare
rest point[];
collect point[];
i integer :=0;
begin
execute '(select array_agg('||dataset||' order by y DESC,x DESC) from '||dataset||')' into rest;
while i<k loop
collect := array_cat(collect,array(select * from skyband_sortedlist(rest)));
rest := array(select * from(select * from unnest(rest) except select * from unnest(collect)) p);
i := i + 1;
end loop;
return collect;
end;
$$ language plpgsql;
答案 0 :(得分:2)
要检查UNION
或EXCEPT
子句中的相等性,PostgreSQL使用类型的默认运算符类的相等运算符作为{ {1}}或btree
访问方法(有关这些条款的说明,请参阅the documentation。)
问题是类型hash
没有这样的运算符类。
您可以自己创建一个。您必须使用point
访问方法,因为无法以合理的方式对点进行排序。
除了等于运算符之外,hash
运算符类还需要数据类型的哈希函数,但为hash
编写一个很容易:
point
现在您可以定义一个运算符类(您必须是超级用户,因为这样一个定义错误的运算符类可能会混淆或崩溃服务器):
CREATE OR REPLACE FUNCTION public.hashpoint(point) RETURNS integer
LANGUAGE sql IMMUTABLE
AS 'SELECT hashfloat8($1[0]) # hashfloat8($1[1])';
现在应该有效:
CREATE OPERATOR CLASS public.point_hash_ops DEFAULT FOR TYPE point USING hash AS
OPERATOR 1 ~=(point,point),
FUNCTION 1 public.hashpoint(point);