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

标签 ruby-on-rails postgresql rails-activerecord postgresql-9.4

在 Rails 中,我可以执行 .where(:attr => [val1, val2, val3]) 并且我将取回与这些 val1-3< 中的任何一个匹配的所有行.

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

有没有办法在 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/

相关文章:

java - 如何使用 Spring JDBC 解决错误的 sql 语法错误?

java - Hibernate 创建了太多的 java 类

postgresql - Postgres : INSERT if does not exist already

ruby-on-rails - 如何基于自定义模型方法查询Rails/ActiveRecord模型?

ruby-on-rails - 如何对现有记录(历史数据)进行 rails 迁移?

MySQL 在查询中使用数组

javascript - jQuery 缺少 Ajax on Rails 目标

ruby-on-rails - Rails 3 : creating a validation with :if statement

ruby-on-rails - ActionView::Template::Error: ActionView::Template::Error: undefined method `[]' for nil:NilClass

ruby-on-rails - 将方法委托(delegate)给 has_many 关联会忽略预加载