在 WHERE 子句中使用 ANY 代替 IN 的方法
假设您在 Rails 中有一个类似于 MyModel.where(id: ids)
的查询,它使用包含 ID 列表的 IN 生成 SQL:
<code class="language-sql">SELECT "my_models".* FROM "my_models" WHERE "my_models".`"id"` IN (1, 28, 7, 8, 12)</code>
要使用 ANY 代替 IN,您可以尝试:
<code class="language-ruby">MyModel.where("id = ANY(VALUES(#{ids.join '),('}))")</code>
但是,当 ids
数组为空时,这种方法会失败,并导致 SQL 语法错误。
理解 IN 和 ANY
IN 和 ANY 表达式有两种形式:
expression IN (subquery)
expression IN (value [, ...])
或 expression ANY (array expression)
对于第二种形式,IN 需要一个值列表,而 ANY 需要一个数组。
何时使用 ANY 和 IN
ANY 是一种更通用的选项,可以与任何返回布尔值的运算符一起使用。IN 是 ANY 的一个特例。
在性能方面,ANY 从来不会比 = ANY
快,而 = ANY
也并不比 IN 快多少。选择应基于方便性。
如果 ID 来自数据库,则使用子查询或 JOIN 更有效。为了以最佳性能从客户端传递很长的值列表,请考虑使用数组、unnest()
或 VALUES 表达式。
= ANY 的语法
Postgres 接受数组表达式的以下形式:
ARRAY[1,2,3]
{1,2,3}
为避免类型转换,请显式转换数组:ARRAY[1,2,3]::numeric[]
。
如何从 Ruby 传递数组
假设 id
是整数:
<code class="language-ruby">MyModel.where('id = ANY(ARRAY[?]::int[])', ids.map { |i| i})</code>
以上是我什么时候应该在 WHERE 子句中使用 ANY 而不是 IN?的详细内容。更多信息请关注PHP中文网其他相关文章!