Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何检查Postgres中是否存在json密钥?_Json_Postgresql_Psycopg2 - Fatal编程技术网

如何检查Postgres中是否存在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中是否存在外键,并返

假设我有一个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,这是预期的。