簡體   English   中英

Postgres 在跳過缺失值的同時有效地檢查 JSONB 包含

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM