其中包含MYSQL值的数组

时间:2017-08-08 19:42:48

标签: mysql sql ruby

让我们说我有这个查询CREATE TABLE example ( foo NOT NULL TEXT[] NOT NULL );

在我目前的用例中,我的id是一个像SELECT * FROM table WHERE id IN (1,2,3,4);

这样的数组

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

即。 [1,2,3,4]

编辑:这是红宝石:)

3 个答案:

答案 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(", "));