在 Rails 中,我可以执行 .where(:attr => [val1, val2, val3])
并且我将取回与这些 val1-3< 中的任何一个匹配的所有行
.
我正在使用 Postgres/Postgresql 并且有一个 jsonb 类型,我想做类似的事情。 PsuedoCode: .where("col @> ?", {attr: [val1, val2, val3]}.to_json)
,但这什么都不返回——因为它试图找到整个数组的值[val1, val2, val3 ]
不是每个单独的值:val1
、val2
、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
的数组.
关于ruby-on-rails - Postgresql jsonb (Rails) - 通过数组在单个 json 属性中查询多个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39022868/