如何检查 Postgres 中是否存在 json 键?
How do I check if a json key exists in Postgres?
假设我有一个 json 看起来像这样:
some_json = {'key_a': {'nested_key': 'a'},
'key_b': {'nested_key': 'b'}}
请注意 key_a
和 key_b
是映射到字典的可选键,可能存在也可能不存在。
我有一个函数可以检查 some_json
和 returns 中是否存在外键和布尔值。
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
等同于布尔值?执行此检查的正确语法是什么?
您的函数与名称完全相反,但修复函数的方法是在 some_json->outer_key
.[=18= 周围添加 (
和 )
]
这是它的完整功能,并且与您的函数名称匹配(注意 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)
您也可以使用'?'像这样的运算符:
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
类型。
要检查键是否存在,您可以使用运算符 -> 这用于通过键获取 Get 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'通过使用运算符 ->>
在 Postgres 中,如果您 select 一个不存在的键,它将 return 为空。
因此您可以通过检查该键的空值来检查该键是否存在。
select '{"key_a": {"nested_key": "a"},
"key_b": {"nested_key": "b"}}'::jsonb->>'a'
------------
null
(1 row)
PostgreSQL 14 为 json/jsonb 添加订阅功能。
SELECT ('{"key_a":1}'::jsonb) ['key_a'] is not null;
return t
.
假设我有一个 json 看起来像这样:
some_json = {'key_a': {'nested_key': 'a'},
'key_b': {'nested_key': 'b'}}
请注意 key_a
和 key_b
是映射到字典的可选键,可能存在也可能不存在。
我有一个函数可以检查 some_json
和 returns 中是否存在外键和布尔值。
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
等同于布尔值?执行此检查的正确语法是什么?
您的函数与名称完全相反,但修复函数的方法是在 some_json->outer_key
.[=18= 周围添加 (
和 )
]
这是它的完整功能,并且与您的函数名称匹配(注意 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)
您也可以使用'?'像这样的运算符:
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
类型。
要检查键是否存在,您可以使用运算符 -> 这用于通过键获取 Get 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'通过使用运算符 ->>
在 Postgres 中,如果您 select 一个不存在的键,它将 return 为空。 因此您可以通过检查该键的空值来检查该键是否存在。
select '{"key_a": {"nested_key": "a"},
"key_b": {"nested_key": "b"}}'::jsonb->>'a'
------------
null
(1 row)
PostgreSQL 14 为 json/jsonb 添加订阅功能。
SELECT ('{"key_a":1}'::jsonb) ['key_a'] is not null;
return t
.