其中与值数组 MYSQL

  • 本文关键字:数组 MYSQL mysql sql ruby
  • 更新时间 :
  • 英文 :


假设我有这个查询SELECT * FROM table WHERE id IN (1,2,3,4);

在我当前的用例中,我的 id 位于如下所示的数组中[1,2,3,4]

如何使用数组数据结构执行相同的查询?

SELECT * FROM table WHERE id IN (myarray);

编辑:这是在红宝石:)

试试这个:

SELECT * FROM table WHERE id IN (myarray.map {|i| ""#{i}""}.join(", "));

您可以使用myarray.join(',')方法将数组转换为逗号分隔的字符串。

最终代码如下所示:

query = "SELECT * FROM table WHERE id IN (#{myarray.join(',')})"

如果数组值是字符串,您可能会遇到一些问题,但它适用于整数。

User.where(id: [1, 2, 3, 4, nil]).to_sql
# SELECT "users".* FROM "users"
# WHERE ("users"."id" IN (1, 2, 3, 4) OR "users"."id" IS NULL)

或者,如果你不能/不想使用where,你可以放入 Arel 来获取 IN 字符串:

User.arel_table[:id].in([1,2,3,4]).to_sql
# => "users"."id" IN (1, 2, 3, 4)

虽然有了这个,你不会自动得到那个漂亮的nil处理。如果您没有 ActiveRecord 模型,但只需使用ActiveRecord::Base在数据库中执行查询(如注释中所述(,您可以执行以下操作:

table = Arel::Table.new(:table) # :table is the name of the table in db
table[:id].in([1,2,3,4]).to_sql
# => "table"."id" IN (1, 2, 3, 4)
table.where(table[:id].in([1,2,3,4])).project(Arel.sql('*')).to_sql
# => SELECT * FROM "table" WHERE "table"."id" IN (1, 2, 3, 4)

而且,尽可能避免Arel/ActiveRecord,你可以这样做

ActiveRecord::Base.send(:sanitize_sql, ['id in (?)', [1,2,3,4]])
# => "id in (1,2,3,4)"

最新更新