如果jsonb文档的根键包含任何文本元素,如数组['喜欢','兴趣','活动','电影','音乐','电视'],我想检查作为约束
create table foo(
bar_json jsonb,
constraint baz check(jsonb_object_keys(bar_json)::text[] @> array['likes','interests','activities','movies','music','television'])
);
上面的一个不起作用。你能帮助我吗? 谢谢!
答案 0 :(得分:1)
通过使用Postgres中可用的JSON operators,可以更好地实现这一目标。
专门供您使用:
?|
:这些键/元素字符串是否存在?
create table foo(
bar_json jsonb,
constraint baz check(bar_json ?| array['likes','interests','activities','movies','music','television'])
);
答案 1 :(得分:0)
函数jsonb_object_keys(jsonb)
返回set,而check
中的表达式不能返回set。
你尝试施放jsonb_object_keys(jsonb)::text[]
是不正确的,你需要一个聚合。
使用聚合函数bool_and()
创建一个布尔函数,并将其用作check
表达式:
create or replace function check_bar_json(val jsonb)
returns boolean language sql as $$
select
bool_and(elem = any(array['likes','interests','activities','movies','music','television']))
from
jsonb_object_keys(val) elem
$$;
create table foo(
bar_json jsonb,
constraint baz check(check_bar_json(bar_json))
);