【问题标题】:Custom domain array by recurrency of custom domain通过自定义域的recurrency自定义域数组
【发布时间】:2018-07-11 00:13:41
【问题描述】:

关于从其他自定义域创建域的文档say nothing

我只需要创建一组(以前创建的)自定义域,所以它不是problem/solution discussed here

例子:

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

【问题讨论】:

    标签: postgresql sql-domain


    【解决方案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"  
    

    【讨论】:

    • 再次感谢克林!好吧,关于 PostgreSQL(所有版本!?)对我来说是个坏消息...所以,是吗?... PostgreSQL 域很丑,在自定义数据类型中没有重用或重复性。当然,您的解决方案是有效的,并且似乎是唯一的方法......我只是不相信 PostgreSQL 域如此糟糕:不优雅且难以扩展/概括数据类型。 PS:我再等几天看看有没有人给出线索,再接受你的回答。
    • 域的概念在设计上很简单。另一方面,您可以通过相对简单的方式获得想要的效果。
    猜你喜欢
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 2017-09-01
    • 1970-01-01
    • 2020-05-25
    • 2014-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多