次のような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
がブール値と等しいのはなぜですか?このチェックを実行するための適切な構文は何ですか?
関数は名前とは正反対ですが、関数を修正する方法は、(
の周りに)
と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)
「?」も使用できますそのような演算子:
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
タイプのみ。
キーが存在するかどうかを確認するには、演算子を使用することができます->これはキーで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'演算子->>を使用して