让我们说我有这个查询CREATE TABLE example (
foo NOT NULL TEXT[] NOT NULL
);
在我目前的用例中,我的id是一个像SELECT * FROM table WHERE id IN (1,2,3,4);
如何使用数组数据结构进行相同的查询?
即。 [1,2,3,4]
编辑:这是红宝石:)
答案 0 :(得分:1)
您可以使用myarray.join(',')
方法将数组转换为逗号分隔的字符串。
最终代码如下所示:
query = "SELECT * FROM table WHERE id IN (#{myarray.join(',')})"
如果数组值是字符串,则可能会遇到一些问题,但它对整数来说效果很好。
答案 1 :(得分:1)
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
在数据库中执行查询(如comments中所述),您可以这样做:
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)"
答案 2 :(得分:1)
试试这个:
SELECT * FROM table WHERE id IN (myarray.map {|i| "\"#{i}\""}.join(", "));