Postgres:为json列构建检查约束

时间:2015-11-17 12:09:16

标签: json postgresql

如果jsonb文档的根键包含任何文本元素,如数组['喜欢','兴趣','活动','电影','音乐','电视'],我想检查作为约束

create table foo(
    bar_json jsonb,
    constraint baz check(jsonb_object_keys(bar_json)::text[] @> array['likes','interests','activities','movies','music','television'])
);

上面的一个不起作用。你能帮助我吗? 谢谢!

2 个答案:

答案 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))
);