Sql Postgres有效地检查JSONB包含的内容,同时跳过缺少的值

Sql Postgres有效地检查JSONB包含的内容,同时跳过缺少的值,sql,arrays,json,postgresql,Sql,Arrays,Json,Postgresql,我有一个带有JSONBsub列的表,其中包含一个json对象数组,如下所示 [{ "a": "alpha", "b": "bravo", "country": "usa" }, { "a": "alpha", "b": "bravo", "c

我有一个带有JSONB
sub
列的表,其中包含一个json对象数组,如下所示

[{
    "a": "alpha",
    "b": "bravo",
    "country": "usa"
},
{
    "a": "alpha",
    "b": "bravo",
    "country": "canada"
}]
现在,我的web服务需要查找表中的一行是否至少有一个与请求json对象匹配的对象。但仅对于它在数组对象中实际具有的属性,任何未知属性都应被忽略

换句话说,以下请求将匹配,因为该行有一个属性为a、b的对象,以及与数组中的对象匹配的国家/地区

{
  "a": "alpha",
  "b": "bravo",
  "country": "usa",
  "x": "XRAY",
  "z": "ZULU",
}
我尝试使用jsonb
@>
操作符,它可以在数组中查找匹配项,但它希望所有属性都在那里。因此,由于未知的x和z属性,以下查询无法工作

select *
from table t
where sub @> '[{"a": "alpha","b": "bravo","country": "usa","x": "XRAY","z": "ZULU"}]'::jsonb

您希望对数组中的每个项使用
@>
,而不是对数组本身。在这里很方便

testdb=# with fake_input_data as (
select ARRAY['{"a": "alpha", "b": "bravo", "country": "usa"}',
        '{"a": "alpha", "b": "bravo", "country": "canada"}']::jsonb[] sub
)

SELECT sub from fake_input_data
WHERE '{"a": "alpha", "b": "bravo", "country": "usa", "x": "xray"}'::jsonb @> ANY(sub);
                                                              sub                                                               
--------------------------------------------------------------------------------------------------------------------------------
 {"{\"a\": \"alpha\", \"b\": \"bravo\", \"country\": \"usa\"}","{\"a\": \"alpha\", \"b\": \"bravo\", \"country\": \"canada\"}"}
(1 row)


您希望对数组中的每个项使用
@>
,而不是对数组本身。在这里很方便

testdb=# with fake_input_data as (
select ARRAY['{"a": "alpha", "b": "bravo", "country": "usa"}',
        '{"a": "alpha", "b": "bravo", "country": "canada"}']::jsonb[] sub
)

SELECT sub from fake_input_data
WHERE '{"a": "alpha", "b": "bravo", "country": "usa", "x": "xray"}'::jsonb @> ANY(sub);
                                                              sub                                                               
--------------------------------------------------------------------------------------------------------------------------------
 {"{\"a\": \"alpha\", \"b\": \"bravo\", \"country\": \"usa\"}","{\"a\": \"alpha\", \"b\": \"bravo\", \"country\": \"canada\"}"}
(1 row)


答案中是否一定要使用
jsonb\u数组\u元素\u文本
?我看到
[42809]错误:op ANY/ALL(数组)需要右侧的数组
。不,这不应该是必需的。在
@>
的右侧是否有任何(子)按钮?错误消息暗示您没有。不幸的是,你不能只是交替使用
ANY(x)ANY(x)
任何都必须在右边,原因我想我过去知道,但现在记不起来了:)你的答案中一定要用
jsonb\u数组\u元素\u文本吗?我看到
[42809]错误:op ANY/ALL(数组)需要右侧的数组
。不,这不应该是必需的。在
@>
的右侧是否有任何(子)按钮?错误消息暗示您没有。不幸的是,你不能只是交替使用
ANY(x)ANY(x)
ANY必须位于右侧,原因我想我以前知道,但现在记不起来了:)