文档没有提到从其他自定义域创建域。
我只需要创建(以前创建的(自定义域数组,因此这不是此处讨论的问题/解决方案。
例:
CREATE DOMAIN jbag AS JSONb
CHECK( VALUE IS NULL OR jsonb_typeof(VALUE) IN ('object','null') );
但是PostgreSQL不接受像CREATE FUNCTION intersection(jbag[]) RETURNS jbag
这样的描述。
如何做一种CREATE DOMAIN jbag[] AS jbag[]
?...或者对 postgresql-parser 说"你好,让我们接受原子自定义类型的数组!"?
有关详细信息,请参阅袋子.sql
您可以
基于预定义的数组类型创建域,在本例中为 jsonb[].
使用一个函数定义一个检查约束,确保所有数组元素都与jbag
兼容:
create or replace function jbags_check(jsonb[])
returns boolean language sql immutable as $$
select bool_and(elem is null or jsonb_typeof(elem) in ('object','null'))
from unnest($1) u(elem);
$$;
create domain jbags as jsonb[]
check(jbags_check(value));
现在,您的函数可能如下所示:
CREATE FUNCTION intersection(jbags) RETURNS jbag AS $f$
SELECT jsonb_object_agg(e,m::int)::jbag
FROM (
SELECT e, MIN(m) AS m
FROM unnest($1), jsonb_each_text(unnest) as a(e, m)
GROUP BY e
HAVING COUNT(*)=array_length($1,1)
) t
$f$ language SQL IMMUTABLE;
实际功能:
select intersection(array['{"a": 2}', '{"a": 3, "b": 3}']::jbags);
intersection
--------------
{"a": 2}
(1 row)
但:
select intersection(array['1', '{"a": 3, "b": 3}']::jbags);
ERROR: value for domain jbags violates check constraint "jbags_check"