PostgreSQL: ограничение CHECK для непустых объектов JSON

Я хочу иметь ограничение CHECK для столбца JSONB, которое разрешает только непустые объекты JSON (только {} с атрибутами, никаких других значений, таких как [] или примитивы JSON).

Я только хочу проверить "корневое" значение, неважно, что хранится в этих объектах.

Как я могу это сделать?


person snøreven    schedule 08.01.2015    source источник


Ответы (1)


Так же, как и любое ограничение проверки, используйте операторы ‹>. Из руководства:

Стандартные операторы сравнения, показанные в таблице 9-1, доступны для jsonb, но не для json.

А в таблице 9.1 показан оператор не равно ‹>:

create table foo(
    bar jsonb,
    constraint baz check(bar <> '{}'::jsonb)
);

insert into foo(bar) values('{"foo": 1}'::jsonb);
insert into foo(bar) values('{}'::jsonb); -- fails
person Frank Heikens    schedule 08.01.2015
comment
Это не то, что я спросил. Он запрещает только '{}'. Я все равно смогу вставить, например, «[]» или «true». - person snøreven; 09.01.2015
comment
Затем поместите эти условия также в контрольное ограничение, используя ИЛИ - person Frank Heikens; 09.01.2015
comment
Ну, в основном это был вопрос, как именно это сделать. Но я понял, что просто упустил из виду функцию json_typeof() - поэтому я не мог просто ИЛИ, потому что я понятия не имел, с чем. Работаем сейчас, спасибо! - person snøreven; 09.01.2015
comment
@snøreven, каким было ваше решение в конце концов? - person Ian Storm Taylor; 17.09.2015
comment
@ ian-storm-taylor Я только что написал ответ. - person snøreven; 17.09.2015