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

Teb*_*oto 29 python postgresql json psycopg2

假设我有一个看起来像这样的json:

some_json = {'key_a': {'nested_key': 'a'},
             'key_b': {'nested_key': 'b'}}
Run Code Online (Sandbox Code Playgroud)

请注意,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;
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

ProgrammingError: operator does not exist: json -> boolean
Run Code Online (Sandbox Code Playgroud)

为什么outer_key等同于布尔值?执行此检查的正确语法是什么?

小智 44

你也可以使用'?' 这样的运算符:

SELECT '{"key_a":1}'::jsonb ? 'key_a'
Run Code Online (Sandbox Code Playgroud)

如果您需要通过嵌套键进行查询,请使用如下:

SELECT '{"key_a": {"nested_key": "a"}}'::jsonb -> 'key_a' ? 'nested_key' 
Run Code Online (Sandbox Code Playgroud)

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

注意:仅适用于jsonb类型.

  • 这似乎是一个更好的答案,因为一个值为 null 的键将返回 true,这是预期的。 (6认同)
  • 请注意,当在准备 SQL 语句的服务(例如元数据库)中使用它时,它不会工作,但您可以使用“??”而不是“?”。 (4认同)

X-I*_*nce 24

你的功能与名称完全相反,但修复你的功能的方法是添加()绕过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;
Run Code Online (Sandbox Code Playgroud)

一些测试:

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

在这里,当一个密钥不存在时:

select key_exists('{"key_a": {"nested_key": "a"}, "key_b": {"nested_key": "b"}}'::json, 'test');
 key_exists 
------------
 f
(1 row)
Run Code Online (Sandbox Code Playgroud)


jia*_*ian 6

PostgreSQL 14 添加了 json/jsonb 的下标功能。

SELECT ('{"key_a":1}'::jsonb) ['key_a'] is not null;

返回t