Postgresql jsonb (Rails) - 通过数组在单个 json 属性中查询多个值

Postgresql jsonb (Rails) - query multiple values, via an array, in a single json attribute

在 Rails 中,我可以执行 .where(:attr => [val1, val2, val3]) 并且我将返回与任何 val1-3.

匹配的所有行

我正在使用 Postgres/Postgresql 并且有一个 jsonb 类型,我想做类似的事情。 PsuedoCode:.where("col @> ?", {attr: [val1, val2, val3]}.to_json),但是这个 returns 什么都没有 - 因为它试图找到整个数组的值 [val1, val2, val3 ] 而不是每个单独的值:val1val2, val3?

有没有办法在 jsonb 查询中传入多个值,相对于单个属性?

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

我已经尝试了 https://www.postgresql.org/docs/9.4/static/functions-json.html 中的各种方法,但似乎有一个解决方案可以避开我。

您通常可以使用 ANY:

概括 OR 表达式

9.23.3. ANY/SOME (array)

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.[=25 的数组=]