postgresql 如何检查Postgres中是否存在json键?

bzzcjhmw  于 2023-03-17  发布在  PostgreSQL
关注(0)|答案(5)|浏览(365)

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

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

注意,key_akey_b是Map到字典的可选键,可能存在也可能不存在。
我有一个函数检查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等于布尔值?执行这个检查的正确语法是什么?

xxb16uws

xxb16uws1#

您还可以使用“?”运算符,如下所示:

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

moiiocjp

moiiocjp2#

您的函数与名称完全相反,但修复函数的方法是在some_json->outer_key周围添加()
下面是它的完整功能,并且与函数名匹配(注意NULL前面的NOT)。

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)
6tr1vspr

6tr1vspr3#

要检查键是否存在,您可以使用运算符-〉this用于通过键获取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“,方法是使用运算符-〉〉

nkhmeac6

nkhmeac64#

PostgreSQL 14为json/jsonb添加了下标功能。
SELECT ('{"key_a":1}'::jsonb) ['key_a'] is not null;
返回t

laik7k3q

laik7k3q5#

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

select '{"key_a": {"nested_key": "a"},
    "key_b": {"nested_key": "b"}}'::jsonb->>'a'
------------
null
(1 row)

相关问题