1

在Rails中,我可以做.where(:attr => [val1, val2, val3]),我將找回匹配這些val1-3中的任何一行的所有行。Postgresql jsonb(Rails) - 通過數組在單個json屬性中查詢多個值

我正在使用Postgres/Postgresql,並有一個jsonb類型,我想做類似的事情。 PsuedoCode:.where("col @> ?", {attr: [val1, val2, val3]}.to_json),但這不會返回任何 - bc它試圖找到整個數組的值[val1, val2, val3 ]不是每個單獨的值:val1,val2,val3

有沒有什麼辦法可以在jsonb查詢中傳遞多個值,相對於單個屬性?

我可以做.where("attr @> {.. val1 ...} OR attr @> {... val2 ..} ..."),但它似乎會有更好的方法。

我試過https://www.postgresql.org/docs/9.4/static/functions-json.html的各種東西,但似乎有一個解決方案逃避我。

回答

5

你可以經常概括或使用ANY表達式:

9.23.3。 ANY/SOME(陣列)

expression operator ANY (array expression) 
expression operator SOME (array expression) 

因此,像這樣:

where c = 1 or c = 2 or c = 3 

可以寫爲:

where c = any(array[1,2,3]) 

操作不必是=或當然,它可以是>like或甚至@>。此外,如果佔位符的值是數組然後ActiveRecord的將展開陣列作爲逗號分隔的列表在SQL所以像:

where('c = any(array[?])', [1,2,3]) 

將變爲:

where c = any(array[1,2,3]) 

由時間數據庫看到它。

結合您的JSON上面給你的東西,如:

where('attr @> any(array[?]::jsonb[])', [val1, val2, val3].map(&:to_json)) 

::jsonb[]是投以確保PostgreSQL的看到陣列作爲jsonb的陣列,而不是text陣列的類型。

+0

甜!我今天會測試它並回復你! – Taysky

+0

很棒!謝謝! 'Model.where(「model_attributes @> any(array [?] :: jsonb [])」,[{attr:1},{attr:2}]。map(&:to_json))'!! – Taysky