'{"a":1,"b":2,"c":3}'::jsonb ?& array['a','b']
检查左侧的顶级键是否包含右侧(文本数组)。
如何查看相反的内容?也就是说,json字符串的键是否来自一组已知的文本。
'{"a":1,"b":2,"c":3}'::jsonb ?& array['a','b']
检查左侧的顶级键是否包含右侧(文本数组)。
如何查看相反的内容?也就是说,json字符串的键是否来自一组已知的文本。
您可以使用json(b)_object_keys
获取对象的键并将它们收集到一个数组中。然后使用array contains operator:
array(SELECT jsonb_object_keys('{"a":1,"b":2,"c":3}'::jsonb)) <@ array['a','b']
或者,您可以在键上使用子查询,并对数组进行共轭测试(等同于@GMB的NOT EXISTS
检查):
SELECT bool_and(k = ANY(array['a','b'])) FROM jsonb_object_keys(object) as k
,
您可以像这样使用jsonb_object_keys()
和ANY
:
select 1
from jsonb_object_keys(t.js) o(x)
where not x = ANY(ar)
Here is 如何在查询中使用它:
with t as (
select '{"a":1,"c":3}'::jsonb js,array['a','b','c'] ar
union all select '{"a":1,"z":3}'::jsonb js,'b'] ar
)
select
js,ar,not exists(
select 1
from jsonb_object_keys(t.js) o(x)
where not x = ANY(ar)
) res
from t
收益:
js | ar | res :----------------------- | :------ | :----- {"a": 1,"b": 2,"c": 3} | {a,b,c} | true {"a": 1,"z": 3} | {a,b} | false