Nehmen wir an, ich habe einen Json, der so aussieht:
some_json = {'key_a': {'nested_key': 'a'},
'key_b': {'nested_key': 'b'}}
Beachten Sie, dass key_a
und key_b
optionale Schlüssel sind, die Wörterbüchern zugeordnet sind und möglicherweise nicht vorhanden sind.
Ich habe eine Funktion, die prüft, ob ein äußerer Schlüssel in some_json
vorhanden ist, und einen Boolean zurückgibt.
CREATE FUNCTION key_exists(some_json json, outer_key text)
RETURNS boolean AS $$
BEGIN
RETURN (some_json->outer_key IS NULL);
END;
$$ LANGUAGE plpgsql;
Ich erhalte folgende Fehlermeldung:
ProgrammingError: operator does not exist: json -> boolean
Warum ist outer_key
gleich einem Boolean? Was ist die richtige Syntax für diese Überprüfung?
Ihre Funktion tut genau das Gegenteil von dem, was der Name ist, aber Sie können (
und )
um den some_json->outer_key
hinzufügen.
Hier ist es voll funktionsfähig und stimmt mit dem Namen Ihrer Funktion überein (beachten Sie die NOT
vor der 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;
Einige Tests:
select key_exists('{"key_a": {"nested_key": "a"}, "key_b": {"nested_key": "b"}}'::json, 'key_a');
key_exists
------------
t
(1 row)
Und hier, wenn es keinen Schlüssel gibt:
select key_exists('{"key_a": {"nested_key": "a"}, "key_b": {"nested_key": "b"}}'::json, 'test');
key_exists
------------
f
(1 row)
Sie können auch das '?' Betreiber wie das:
SELECT '{"key_a":1}'::jsonb ? 'key_a'
Und wenn Sie nach verschachtelten Schlüsseln abfragen möchten, verwenden Sie Folgendes:
SELECT '{"key_a": {"nested_key": "a"}}'::jsonb -> 'key_a' ? 'nested_key'
Siehe http://www.postgresql.org/docs/9.5/static/functions-json.html
NOTE: Nur für jsonb
-Typ.
Um zu prüfen, ob der Schlüssel vorhanden ist oder nicht, können Sie den Operator verwenden -> Dies wird verwendet, um das Get JSON-Objektfeld nach Schlüssel abzufragen Beispiel:
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;
Sie können den Schlüssel auch über den Operator #> und # >> suchen
Rufen Sie das JSON-Objektfeld als Text ab: '{"a": 1, "b": 2}' :: json - >> 'b', indem Sie den Operator - >> verwenden