【发布时间】:2023-03-05 02:01:01
【问题描述】:
我曾经有过这样的查询:
MyModel.where(id: ids)
这会生成如下的 sql 查询:
SELECT "my_models".* FROM "my_models"
WHERE "my_models"."id" IN (1, 28, 7, 8, 12)
现在我想将其更改为使用 ANY 而不是 IN。我创建了这个:
MyModel.where("id = ANY(VALUES(#{ids.join '),('}))"
现在当我使用空数组 ids = [] 时,我得到以下错误:
MyModel Load (53.0ms) SELECT "my_models".* FROM "my_models" WHERE (id = ANY(VALUES()))
ActiveRecord::JDBCError: org.postgresql.util.PSQLException: ERROR: syntax error at or near ")"
ActiveRecord::StatementInvalid: ActiveRecord::JDBCError: org.postgresql.util.PSQLException: ERROR: syntax error at or near ")"
Position: 75: SELECT "social_messages".* FROM "social_messages" WHERE (id = ANY(VALUES()))
from arjdbc/jdbc/RubyJdbcConnection.java:838:in `execute_query'
【问题讨论】:
-
如果您要编写自定义查询,请非常小心使用占位符:
VALUES(?)根据需要扩展并绑定数组比您使用的要好得多有这里。您需要小心正确地转义注入 SQL 的任何原始值。这个查询的目的是什么? -
在我的真实查询中,我在 IN 部分有很多 ID,所以我想在这种情况下使用 ANY 来优化它。
-
在 PostgreSQL 中,
IN是= ANY的别名 -
这些 id 是从哪里来的?也许您应该加入或使用子查询,而不是向数据库发送大量 id。
-
@PinnyM:
IN不是= ANY的别名。我提供了详细信息。
标签: sql ruby-on-rails-3 postgresql ruby-on-rails-4 activerecord