1

文档没有说明从其他自定义域创建域。

我只需要创建(以前创建的)自定义域的数组,所以这不是这里讨论的问题/解决方案

例子:

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 说“你好,让我们接受原子自定义类型的数组!”?


有关详细信息,请参阅bag.sql

4

1 回答 1

1

您可以基于预定义的数组类型创建域,在这种情况下,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"  
于 2018-01-31T20:25:01.183 回答