目的は、特定のキーがJSONデータ型にないすべてのレコードを返すことです。postgresql undefined jsonフィールドがnullを返すことはありません。
id::SERIAL | data::JSON
------------+-------------------
1 | {"key" : "val"}
2 | {"key1" : "val2"}
次の2つのステートメントのいずれか::
SELECT * FROM test WHERE data->>'faultyField' = null;
SELECT * FROM test WHERE (data->>'faultyField')::text = 'null';
を返す必要がありますだけで、それは明らかにするために、私は次の表のデータのうちfaultyField
戻りnull
何のためにJSON構造を照会しようとしていますすべての値(私が仕事場で見つけた2つのSO投稿による)?しかし何らかの理由でそれはありません。これらの2つは空の結果を返します。
私はPostgreSQLのウィザードではありませんので、これらの文の間のすべてを試してみました。悲しいことに彼らはしません。
SELECT * FROM test WHERE (SELECT json_object_keys(data) FROM test)='key';
SELECT * FROM test WHERE 'key' in json_object_keys(data);
SELECT * FROM test WHERE 'key' := json_object_keys(data);
SELECT * FROM test WHERE 'key' ANY (json_object_keys(data));
キーがJSON文字列にない場合にレコードを返す方法はありますか?
私は、その値をテストするのではなく、キーが存在するかどうかを確認しようとしていると思います。この場合、 'data - >> 'faultyField'がnull'は、' faultyField'キーが存在し、ヌル値を持っていても行を返します。しかし私は間違っている可能性があります。 –
あなたは間違っています。 'data - >> 'faultyField' is null'は、キーがない場合にのみtrueです。 – klin
本当ですか? 'CREATE TEMP TABLE test AS SELECT 1 AS id、 '{" key ":null}' :: JSONB ASデータ。 SELECT * FROMテストWHEREデータ - >> 'キー'はNULLです。 'このテストケースは、期待どおりの行を返します。 9.5.6でテスト済み。 –