2015-03-07 11 views
7

Powiedzmy mam json, który wygląda tak:Jak sprawdzić, czy klucz json istnieje w PostgreSQL?

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

Zauważ, że key_a i key_b są opcjonalne klawisze odwzorowane do słowników i może lub nie istnieje.

Mam funkcję, która sprawdza, czy klucz zewnętrzny istnieje w some_json i zwraca wartość logiczną.

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

pojawia się następujący błąd:

ProgrammingError: operator does not exist: json -> boolean 

Dlaczego outer_key zrównanie się wartości logicznej? Jaka jest prawidłowa składnia, aby wykonać tę kontrolę?

+0

Json to typ – Teboto

Odpowiedz

12

Twoja funkcja jest dokładnie odwrotna do nazwy, ale sposobem naprawy funkcji jest dodanie ( i ) wokół some_json->outer_key.

Oto, czy w pełni działa i pasuje do nazwy funkcji (zwróć uwagę na NOT przed numerem 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; 

Niektóre testy:

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

i tu, gdy klucz nie istnieje:

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

Rozumiem, dziękuję! Takie proste rozwiązanie, ale łatwe do przeoczenia. Również dobry połów na nazwę. – Teboto