Как проверить, существует ли ключ 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 ' с помощью оператора ->>