web-dev-qa-db-ja.com

jsonキーがPostgresに存在するかどうかを確認するにはどうすればよいですか?

次のようなjsonがあるとします。

some_json = {'key_a': {'nested_key': 'a'},
             'key_b': {'nested_key': 'b'}}

key_aおよびkey_bは、辞書にマップされるオプションのキーであり、存在する場合と存在しない場合があります。

some_jsonに外部キーが存在するかどうかを確認し、ブール値を返す関数があります。

CREATE FUNCTION key_exists(some_json json, outer_key text)
RETURNS boolean AS $$
BEGIN
    RETURN (some_json->outer_key IS NULL);
END;
$$ LANGUAGE plpgsql;

次のエラーが表示されます。

ProgrammingError: operator does not exist: json -> boolean

outer_keyがブール値と等しいのはなぜですか?このチェックを実行するための適切な構文は何ですか?

28
Teboto

関数は名前とは正反対ですが、関数を修正する方法は、(の周りに)some_json->outer_keyを追加することです。

これは完全に機能し、関数の名前と一致しています(NOTの前にNULLがあります)。

CREATE FUNCTION key_exists(some_json json, outer_key text)
RETURNS boolean AS $$
BEGIN
    RETURN (some_json->outer_key) IS NOT NULL;
END;
$$ LANGUAGE plpgsql;

いくつかのテスト:

select key_exists('{"key_a": {"nested_key": "a"}, "key_b": {"nested_key": "b"}}'::json, 'key_a');
 key_exists 
------------
 t
(1 row)

そして、キーが存在しない場合:

select key_exists('{"key_a": {"nested_key": "a"}, "key_b": {"nested_key": "b"}}'::json, 'test');
 key_exists 
------------
 f
(1 row)
22
X-Istence

「?」も使用できますそのような演算子:

SELECT '{"key_a":1}'::jsonb ? 'key_a'

ネストされたキーでクエリする必要がある場合は、次のように使用します。

SELECT '{"key_a": {"nested_key": "a"}}'::jsonb -> 'key_a' ? 'nested_key' 

http://www.postgresql.org/docs/9.5/static/functions-json.html を参照してください

[〜#〜] note [〜#〜]jsonbタイプのみ。

39
DaL

キーが存在するかどうかを確認するには、演算子を使用することができます->これはキーでJSONオブジェクトフィールドを取得するために使用されます例:

actual json data in column(attribute): {
    "active": "t",
    "email_address": "[email protected]",
    "pin": "2233"
}

SELECT attributes::json->'email_address'
FROM entity
WHERE entity_id = 55;

演算子#>および#>>を使用してキーを検索することもできます

JSONオブジェクトフィールドをテキストとして取得します: '{"a":1、 "b":2}' :: json->> 'b'演算子->>を使用して

0
Piyush Sharma