如何检查Postgres中是否存在json密钥?
假设我有一个json,看起来像这样:如何检查Postgres中是否存在json密钥?,json,postgresql,psycopg2,Json,Postgresql,Psycopg2,假设我有一个json,看起来像这样: some_json = {'key_a': {'nested_key': 'a'}, 'key_b': {'nested_key': 'b'}} SELECT '{"key_a": {"nested_key": "a"}}'::jsonb -> 'key_a' ? 'nested_key' 请注意,key_a和key_b是映射到字典的可选键,可能存在也可能不存在 我有一个函数,它检查some_json中是否存在外键,并返
some_json = {'key_a': {'nested_key': 'a'},
'key_b': {'nested_key': 'b'}}
SELECT '{"key_a": {"nested_key": "a"}}'::jsonb -> 'key_a' ? 'nested_key'
请注意,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\u key
等于布尔值?执行此检查的正确语法是什么?您的函数与名称完全相反,但修复函数的方法是在一些json>外键周围添加(
和)
下面是它的完整功能,并且与函数名匹配(注意NULL
前面的NOT
)
一些测试:
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'
如果需要通过嵌套键进行查询,请使用以下命令:
some_json = {'key_a': {'nested_key': 'a'},
'key_b': {'nested_key': 'b'}}
SELECT '{"key_a": {"nested_key": "a"}}'::jsonb -> 'key_a' ? 'nested_key'
看
注意:仅适用于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;
您还可以通过operator#>和#>>搜索密钥
使用Postgres中的运算符->>以文本形式获取JSON对象字段:“{a:1,“b:2}”::JSON->>'b',如果选择不存在的键,它将返回null。
因此,您可以通过检查某个键的空值来检查该键是否存在
select '{"key_a": {"nested_key": "a"},
"key_b": {"nested_key": "b"}}'::jsonb->>'a'
------------
null
(1 row)
让它工作起来了,谢谢!这样一个简单的解决方案却容易被忽视。还有一个很好的名称。请注意,当在准备SQL语句的服务(例如Metabase)中使用此名称时,它将不起作用,但您可能可以使用?
而不是?
。这似乎是一个更好的答案,因为值为null的键将返回为true,这是预期的。