1. ホーム
  2. json

空のオブジェクトのjsonカラムをクエリするには?

2023-08-11 01:13:48

質問

特定の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(最終章)のこの関連する回答で説明しています。

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

式の両辺をキャストして text とすることで = または <> 演算子のテキスト表現には多くの可能性があるため、通常は信頼できません。 と同じ JSON値に対して多くの可能なテキスト表現があるからです。Postgres 9.4以降では、キャストして jsonb にキャストしてください。(または jsonb を使ってください)。

しかし については この特定のケース ( 空オブジェクト ) はうまく動作します。

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