如何检查JSON键是否来自PostgreSQL中的允许集?

'{"a":1,"b":2,"c":3}'::jsonb ?& array['a','b']检查左侧的顶级键是否包含右侧(文本数组)。

如何查看相反的内容?也就是说,json字符串的键是否来自一组已知的文本。

zhanghaowl 回答:如何检查JSON键是否来自PostgreSQL中的允许集?

您可以使用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

online demo

,

您可以像这样使用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  
本文链接:https://www.f2er.com/3163716.html

大家都在问