Postgres9.5のJSONBフィールド内のプロパティからnull以外の値を選択できません
SELECT data->>'property' FROM mytable WHERE data->>'property' IS NOT NULL;
NOTNULLも使ってみました。
これらのいずれかを実行すると、エラー42883が発生します。 「エラー:演算子が存在しません。JSONB->> booleanヒント:指定された名前と引数の型に一致する演算子がありません。明示的な型キャストを追加する必要がある場合があります。」
私はすぐにあなたの質問をテストしましたが、問題は見つかりませんでした。
_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
にキャストするのではなく、NULL
のtext
値をテストします。より効率的で、確かに大きなテーブルで。これは明らかに真のnull
sでのみ機能します。