78

特定の 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.
4

6 に答える 6

142

等値を確立するのは難しいため、データ型全体に対する等値 (または不等値) 演算子はありません。これが可能な Postgres 9.4 以降でjson検討してください。jsonbdba.SEに関するこの関連する回答の詳細(最後の章):

SELECT DISTINCT json_column ...または... GROUP BY json_column同じ理由で失敗します (等号演算子なし)。

式の両側をallowまたは演算子にキャストしtextますが、同じJSON 値に対して多くの可能なテキスト表現が存在するため、通常は信頼できません。Postgres 9.4 以降では、代わりにキャストします。(または、最初から使用します。)=<>jsonbjsonb

ただしこの特定のケース(空のオブジェクト) では問題なく動作します。

select * from test where foo::text <> '{}'::text;
于 2014-06-18T22:32:12.713 に答える
6

PostgreSQL 9.5 では、JSON データを使用したこのタイプのクエリは実行できません。一方、私はそれが非常に役立つことに同意し、リクエストを作成しました:

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

自由に投票してください。実装されることを願っています!

于 2016-02-12T16:41:04.773 に答える
3

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

どちらの手法も、フォーマットに関係なく問題なく機能します

于 2014-07-25T21:15:19.063 に答える