在等待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
);