Как запросить json-столбец для пустых объектов?

Глядя на поиск всех строк, где определенный столбец json содержит пустой объект, {} . Это возможно с массивами JSON, или если я ищу конкретный ключ в объекте. Но я просто хочу знать, пустой ли объект. Кажется, не может найти оператора, который сделает это.

  dev=# \d test Table "public.test" Column | Type | Modifiers --------+------+----------- foo | json | dev=# select * from test; foo --------- {"a":1} {"b":1} {} (3 rows) dev=# select * from test where foo != '{}'; ERROR: operator does not exist: json  unknown LINE 1: select * from test where foo != '{}'; ^ HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts. dev=# select * from test where foo != to_json('{}'::text); ERROR: operator does not exist: json  json LINE 1: select * from test where foo != to_json('{}'::text); ^ HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts. dwv=# select * from test where foo != '{}'::json; ERROR: operator does not exist: json  json LINE 1: select * from test where foo != '{}'::json; ^ HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts. 

Не существует оператора равенства (или неравенства) для типа данных json в целом, так как равенство трудно установить. Вы будете любить jsonb в Postgres 9.4, где это возможно. Подробнее об этом связанном ответе на dba.SE (последняя глава):

  • Как удалить известные элементы из массива JSON [] в PostgreSQL?

Отбрасывание обеих сторон выражения в text допускает операторы = или <> , но это не является обычно надежным, существует множество возможных текстовых представлений для одного и того же значения json .

Однако для этого конкретного случая он работает очень хорошо:

 select * from test where foo::text <> '{}'::text; 

Начиная с PostgreSQL 9.5 этот тип запроса с данными JSON невозможен. С другой стороны, я согласен, что это будет очень полезно и создаст запрос на него:

https://postgresql.uservoice.com/forums/21853-general/suggestions/12305481-check-if-json-is-empty

Не стесняйтесь голосовать, и, надеюсь, он будет реализован!

В 9.3 можно считать пары в каждом объекте и фильтровать те, у кого нет

 create table test (foo json); insert into test (foo) values ('{"a":1, "c":2}'), ('{"b":1}'), ('{}'); select * from test where (select count(*) from json_each(foo) s) = 0; foo ----- {} 

или проверить существование, возможно, быстрее для больших объектов

 select * from test where not exists (select 1 from json_each(foo) s); 

Оба метода будут работать безупречно независимо от формирования

  • Буферный тип данных C99?
  • Вопрос о поведении C для неподписанного целого нижнего streamа
  • Каков размер столбца int (11) в mysql в байтах?
  • Почему streamи C ++ используют char вместо unsigned char?
  • Вычисление переменной с использованием переменной типа
  • Условный оператор не может действовать неявно?
  • Использование IsAssignableFrom с открытыми типами
  • Преобразовать строку в тип C #
  • Рекомендации по хранению почтовых адресов в базе данных (РСУБД)?
  • Какова цель вопросительного знака после типа (например: int? MyVariable)?
  • Интерфейсы Java и типы возврата
  • Давайте будем гением компьютера.