2017-06-21 4 views
2

目的は、特定のキーが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文字列にない場合にレコードを返す方法はありますか?

答えて

3

=nullを使用しないでください。試してみてください:

select * 
from test 
where data->>'faultyField' is null; 

the documentationから:

NULLはNULL "に等しい" ではないので、表現= NULLを記述しないでください。 (NULL値は不明の値を表し、2つの未知の値が等しいかどうかは不明である。)

+0

私は、その値をテストするのではなく、キーが存在するかどうかを確認しようとしていると思います。この場合、 'data - >> 'faultyField'がnull'は、' faultyField'キーが存在し、ヌル値を持っていても行を返します。しかし私は間違っている可能性があります。 –

+0

あなたは間違っています。 'data - >> 'faultyField' is null'は、キーがない場合にのみtrueです。 – klin

+0

本当ですか? 'CREATE TEMP TABLE test AS SELECT 1 AS id、 '{" key ":null}' :: JSONB ASデータ。 SELECT * FROMテストWHEREデータ - >> 'キー'はNULLです。 'このテストケースは、期待どおりの行を返します。 9.5.6でテスト済み。 –

4

EDIT

私は頻繁にあなたがJSONB代わりのJSON使用することをお勧めします。インデックス作成を可能にするより強力な型であり、以下で説明するような追加の演算子があります。


あなたは鍵がjsonb現場での使用のトップレベル ?オペレータに存在していないかどうかをテストする場合: data->>'faultyField'を使用して

CREATE TEMP TABLE test AS VALUES 
    (1, '{"key" : "val"}'::JSONB), 
    (2, '{"key2" : "val2"}'::JSONB); 

SELECT * FROM test WHERE NOT column2 ? 'key3'; 

場合ではなく、テストよりも、このキーの値を取得しようとしますキーが存在する。これは、faultyFieldキーが存在し、ヌル値を持っていても行を返すため、探しているものではありません。

+0

'指定された名前と引数の型に一致する演算子がありません。 '?'に明示的な型キャストを追加する必要があるかもしれません - なぜですか? – Torxed

+0

9.4以降の 'JSONB'型の'? '演算子は存在します。 PostgreSQLのバージョンは何ですか? [docs]に関する詳細(https://www.postgresql.org/docs/current/static/functions-json.html)。 –

+0

私は現在v9.6.1をロッキングしています。 JSONBはバイトデータ用ですか? – Torxed

関連する問題