為簡單起見,一行table看起來像這樣:
key: "z06khw1bwi886r18k1m7d66bi67yqlns",
reference_keys: {
"KEY": "1x6t4y",
"CODE": "IT137-521e9204-ABC-TESTE"
"NAME": "A"
},
我有一個像這樣的 jsonb 物件{"KEY": "1x6t4y", "CODE": "IT137-521e9204-ABC-TESTE", "NAME": "A"},我想在任何鍵的值中搜索查詢。如果我的查詢類似于“521e9204”,我希望它回傳 reference_keys 在任何值中具有“521e9204”的行。對于這種情況,鍵基本上無關緊要。
注意:列reference_keys和 jsonb 物件始終是一維陣列。
我試過這樣的查詢:
SELECT * FROM table
LEFT JOIN jsonb_each_text(table.reference_keys) AS j(k, value) ON true
WHERE j.value LIKE 'R1e9204%'
問題是它會為 json 中的每個鍵重復行,并且會弄亂回傳的專案。
我也想過做這樣的事情:
SELECT DISTINCT jsonb_object_keys(reference_keys) from table;
然后使用如下查詢:
SELECT * FROM table
WHERE reference_keys->>'CODE' like 'R1e9204%'
看起來這可行,但我真的不想依賴這個解決方案。
uj5u.com熱心網友回復:
您可以將 JOIN 重寫為 EXISTS 條件以避免重復:
SELECT t.*
FROM the_table t
WHERE EXISTS (select *
from jsonb_each_text(t.reference_keys) AS j(k, value)
WHERE j.value LIKE 'R1e9204%');
如果您使用的是 Postgres 12 或更高版本,您還可以使用 JSON 路徑查詢:
where jsonb_path_exists(reference_keys, 'strict $.** ? (@ like_regex "521e9204")')
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/536547.html
標籤:postgresql
