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 ]
而不是每个单独的值: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
.[=25 的数组=]
在 Rails 中,我可以执行 .where(:attr => [val1, val2, val3])
并且我将返回与任何 val1-3
.
我正在使用 Postgres/Postgresql 并且有一个 jsonb 类型,我想做类似的事情。 PsuedoCode:.where("col @> ?", {attr: [val1, val2, val3]}.to_json)
,但是这个 returns 什么都没有 - 因为它试图找到整个数组的值 [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
.[=25 的数组=]