it-swarm.com.de

Wie überprüfe ich, ob in Postgres ein Json-Schlüssel vorhanden ist?

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?

18
Teboto

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)
17
X-Istence

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.

28
DaL

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

0
Piyush Sharma