2015-03-07 22 views
7

Diciamo che ho un JSON che assomiglia a questo:Come posso verificare se esiste una chiave JSON in Postgres?

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

noti che key_a e key_b sono tasti opzionali mappati ai dizionari e può o non può esistere.

Ho una funzione che controlla se esiste una chiave esterna in some_json e restituisce un valore booleano.

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

ottengo il seguente errore:

ProgrammingError: operator does not exist: json -> boolean 

Perché outer_key pari ad un valore booleano? Qual è la sintassi corretta per eseguire questo controllo?

+0

Json è il tipo – Teboto

risposta

12

La tua funzione fa esattamente l'opposto di quello che è il nome, ma il modo per risolvere la tua funzione è aggiungere ( e ) attorno allo some_json->outer_key.

Qui è completamente funzionante e corrisponde al nome della funzione (notare lo NOT davanti allo 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; 

Alcuni test:

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

E qui quando una chiave non esiste:

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

Funzionante, grazie! Una soluzione così semplice ma facile da trascurare. Anche una buona presa sul nome. – Teboto

14

è anche possibile utilizzare il '?' operatore del genere:

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

E se hai bisogno di interrogare tramite chiave nidificato, utilizzare in questo modo:

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

Vedi http://www.postgresql.org/docs/9.5/static/functions-json.html

NOTA: Solo per jsonb tipo.

Problemi correlati