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

问题描述 投票:0回答:5

假设我有一个看起来像这样的 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
等同于布尔值?执行此检查的正确语法是什么?

json postgresql psycopg2
5个回答
140
投票

您也可以使用 '?'像这样的运营商:

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


47
投票

您的功能与名称完全相反,但修复功能的方法是在

(
周围添加
)
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)

3
投票

要检查键是否存在,您可以使用运算符 -> 这用于通过键获取 Get JSON 对象字段 例如:

actual json data in column(attribute): {
    "active": "t",
    "email_address": "[email protected]",
    "pin": "2233"
}

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

您还可以通过运算符 #> 和 #>> 搜索键

获取 JSON 对象字段作为文本:'{"a":1,"b":2}'::json->>'b' 使用运算符 ->>


3
投票

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

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

返回

t
.


1
投票

在 Postgres 中,如果您选择一个不存在的键,它将返回 null。 所以你可以通过检查该键的空值来检查该键是否存在。

select '{"key_a": {"nested_key": "a"},
    "key_b": {"nested_key": "b"}}'::jsonb->>'a'
------------
null
(1 row)
© www.soinside.com 2019 - 2024. All rights reserved.