[英]Postgres efficiently check JSONB contains while skipping missing values
我有一個帶有 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
您想對數組中的每個項目使用@>
- 而不是在數組本身上。 ANY在這里派上用場。
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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.