首页 > 数据库 > mysql教程 > 我什么时候应该在 WHERE 子句中使用 ANY 而不是 IN?

我什么时候应该在 WHERE 子句中使用 ANY 而不是 IN?

Linda Hamilton
发布: 2025-01-14 20:37:44
原创
294 人浏览过

When Should I Use ANY Instead of IN in a WHERE Clause?

在 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板