gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 11:38:21 25 4
gpt4 key购买 nike

在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com