postgres array_eq&用户创建的平等

时间:2014-09-18 21:05:49

标签: postgresql

在等待9.4时,我为json创建了一个等于运算符:

select '"1"'::json = '"1"'::json

返回true。

然而,当我尝试:

select array_eq('{"1"}'::json[],'{"1"}'::json[]);

我明白了:

ERROR: could not identify an equality operator for type json
SQL state: 42883

这里发生了什么? array_eq是否无法识别用户定义的相等性?或者还有其他我错过的东西?我应该定义自己的array_eq(anyarray, anyarray)吗?

更新

事实上,即使我为json[]提供了自己的平等,我也无法使用select distinct包括 包含json[]的结果就是这个目的。任何建议的解决方法?

更新(Craig的建议)运营商:

drop operator if exists =(json, json) cascade;

create operator = (
    procedure = json_eq,
    leftarg = json,
    rightarg = json,
    commutator = =,
    restrict = eqsel,
    join = eqjoinsel
);
drop operator if exists =(json[], json[]) cascade;
create or replace function array_eq2( a json[], b json[] ) returns boolean
    language sql as
$$
    select array_ndims(a) = array_ndims(b) 
        and (select bool_and(array_length(a,i) = array_length(b,i))
            from generate_series(1,array_ndims(a)) _(i))
        and (select bool_and(a[i] = b[i]) 
            from generate_series(1,array_length(a,1)) _(i));
$$;
create operator = (
    procedure = array_eq2,
    leftarg = json[],
    rightarg = json[],
    commutator = =,
    restrict = eqsel,
    join = eqjoinsel
);

0 个答案:

没有答案