如何检查Postgres中是否存在json密钥?

2024-05-12 23:42:07 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个json,如下所示:

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

注意key_akey_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等同于布尔值?执行此检查的正确语法是什么?


Tags: key函数textjson字典createexistsfunction
3条回答

你也可以用'?'像这样的接线员:

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类型。

要检查键是否存在,可以使用运算符->;这用于按键获取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',方法是使用运算符->;>

函数的作用与名称完全相反,但修复函数的方法是在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)

相关问题 更多 >