web-dev-qa-db-ja.com

PostgresのJSONBフィールドからnullではないSELECT値

Postgres9.5のJSONBフィールド内のプロパティからnull以外の値を選択できません

SELECT data->>'property' FROM mytable WHERE data->>'property' IS NOT NULL;

NOTNULLも使ってみました。

これらのいずれかを実行すると、エラー42883が発生します。 「エラー:演算子が存在しません。JSONB->> booleanヒント:指定された名前と引数の型に一致する演算子がありません。明示的な型キャストを追加する必要がある場合があります。」

12
sheldonkreger

私はすぐにあなたの質問をテストしましたが、問題は見つかりませんでした。

_patrick@brick:~$ psql -d test
psql (9.5.0)
Type "help" for help.

test=# CREATE TABLE mytable (id serial PRIMARY KEY, data jsonb);
CREATE TABLE
test=# INSERT INTO mytable (data) VALUES
('{"ip": "192.168.0.1", "property": "router"}'),
('{"ip": "127.0.0.1", "property": "localhost"}'),
('{"ip": "192.168.0.15", "property": null}');
INSERT 0 3
test=# SELECT * FROM mytable;
 id |                     data
----+----------------------------------------------
  1 | {"ip": "192.168.0.1", "property": "router"}
  2 | {"ip": "127.0.0.1", "property": "localhost"}
  3 | {"ip": "192.168.0.15", "property": null}
(3 rows)

test=# SELECT data->>'property' FROM mytable WHERE data->>'property' IS NOT NULL;
 ?column?
-----------
 router
 localhost
(2 rows)_

jsonbでは、引用されたバージョンではなく、入力時にNULL値を正確に指定する必要があることに注意してください(上記のサンプルのように)。値がNULLではなく、空の文字列または_'<null>'_(文字列)のようなものである場合は、テストを調整してそれを探す必要があります:_WHERE data->>'property' = ''_。この場合、jsonb_set()を使用してそのような値を真のjsonnullに設定することを検討できます。

ちなみに、次のこともできます。

_SELECT data->>'property' FROM mytable WHERE data->'property' IS NOT NULL;_

つまり、jsonbにキャストするのではなく、NULLtext値をテストします。より効率的で、確かに大きなテーブルで。これは明らかに真のnullsでのみ機能します。

9
Patrick