[英]How to filter a value of any key of json in postgres
我有一個表users
有一個名為data
的jsonb
字段。 我必須檢索在該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.