簡體   English   中英

如何過濾postgres中json任意鍵的值

[英]How to filter a value of any key of json in postgres

我有一個表users有一個名為datajsonb字段。 我必須檢索在該data列中具有與給定字符串匹配的值的所有用戶。 例如:

user1 = data: {"property_a": "a1", "property_b": "b1"}
user2 = data: {"property_a": "a2", "property_b": "b2"}

我想檢索具有匹配'b2'data任何用戶,在本例中為'user2'

知道如何以優雅的方式做到這一點嗎? 我可以從所有用戶的data中檢索所有鍵並手動創建查詢,但這既不快速也不優雅。

此外,我必須檢索匹配的鍵和值,但首先要做的是。

沒有簡單的方法。 根據文檔:

GIN 索引可用於有效搜索大量 jsonb 文檔(數據)中出現的鍵或鍵/值對

大膽強調我的。 所有都沒有索引。 (那些可能具有不兼容的數據類型!)如果您不知道所有鍵的名稱,則必須檢查每一行中的所有 JSON 值。

如果像您演示的那樣只有兩個鍵(或只有幾個眾所周知的鍵),它仍然很容易:

SELECT *
FROM   users
WHERE  data->>'property_a' = 'b2' OR
       data->>'property_b' = 'b2';

可以通過簡單的表達式索引來支持:

CREATE INDEX foo_idx ON users ((data->>'property_a'), (data->>'property_b'))

或者使用 GIN 索引:

SELECT *
FROM   users
WHERE  data @> '{"property_a": "b2"}' OR
       data @> '{"property_b": "b2"}'

CREATE INDEX bar_idx ON users USING gin (data jsonb_path_ops);

如果你不知道所有的鍵名,事情會變得更復雜......

您可以使用jsonb_each()jsonb_each_text()將所有值jsonb_each_text()到一個集合中,然后使用ANY構造進行檢查:

SELECT *
FROM   users
WHERE  jsonb '"b2"' = ANY (SELECT (jsonb_each(data)).value);

或者

...
WHERE  'b2' = ANY (SELECT (jsonb_each_text(data)).value);

db<> 在這里擺弄

但是最后一個沒有索引支持。 您可以改為將所有值提取到數組中並在其上創建一個表達式索引,並將查詢中的該表達式與數組運算符進行匹配...

有關的:

試試這個查詢。

SELECT * FROM users
WHERE data::text LIKE '%b2%'

當然,如果您的密鑰也包含這樣的字符串,它將不起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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