gpt4 book ai didi

postgresql - 通过自定义域的循环自定义域数组

转载 作者:行者123 更新时间:2023-11-29 13:16:14 25 4
gpt4 key购买 nike

文档 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

最佳答案

您可以基于预定义的数组类型创建域,在本例中为 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 - 通过自定义域的循环自定义域数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48549728/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com