Как проверить, существует ли ключ json в Postgres?

предположим, у меня есть 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 приравнивание к булеву? Какой правильный синтаксис для выполнения этой проверки?

3 ответов


ваша функция делает полную противоположность имени, но способ исправить вашу функцию-добавить ( и ) вокруг 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

Примечание: только для jsonb тип.


чтобы проверить, существует ли ключ или нет, вы можете использовать оператор - > это используется для получения поля объекта Get JSON по ключу Например:

actual json data in column(attribute): {
    "active": "t",
    "email_address": "kris.ann.augdahl@hp.com",
    "pin": "2233"
}

SELECT attributes::json->'email_address'
FROM entity
WHERE entity_id = 55;

вы также можете искать ключ с помощью оператора #> и#>>

получить поле объекта JSON в виде текста:'{"a": 1,"b": 2}':: json->>' b ' с помощью оператора ->>