Sql Postgres有效地检查JSONB包含的内容,同时跳过缺少的值
我有一个带有JSONBSql Postgres有效地检查JSONB包含的内容,同时跳过缺少的值,sql,arrays,json,postgresql,Sql,Arrays,Json,Postgresql,我有一个带有JSONBsub列的表,其中包含一个json对象数组,如下所示 [{ "a": "alpha", "b": "bravo", "country": "usa" }, { "a": "alpha", "b": "bravo", "c
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必须位于右侧,原因我想我以前知道,但现在记不起来了:)