在ruby中将数组作为参数添加到sql查询

时间:2018-09-27 09:52:11

标签: ruby postgresql pg

我有一个数组

ziparray = ["95626", "95645", "95837"]

我想将此传递给我的sql查询,

sql = "SELECT * from table_name WHERE code in ($1);"
res1 = conn.exec(sql, [ziparray])

它确实适用于单个值。

我正在使用pg gem,并使用

连接到数据库
conn = PG.connect()

我正在使用postgres,并且不需要双引号。我认为这就是问题所在。 如何实现这一目标。

更新

我可以使用

转换为所需的字符串
str = "'"
str << ziparray.join("','")
str << "'"
#print str

但是我想问题是传递了多个参数。

这有效-

res1 = conn.exec(fipscodesql, ['95626'])

但不是

res1 = conn.exec(fipscodesql, ['95626', '95625'])

这正是我将数组转换为字符串时所做的事情。我猜这不是使用参数的正确方法。 还有其他方法吗?

4 个答案:

答案 0 :(得分:4)

正如其他人所说,您无法参数化整个数组。改用它:

ziparray = ["95626", "95645", "95837"]
zip_placeholders = ziparray.map.with_index(1) { |_, i| "$#{i}" }.join(', ')
sql = "SELECT * from table_name WHERE code in (#{zip_placeholders});"
# => "SELECT * from table_name WHERE code in ($1, $2, $3)"

然后您可以使用常规参数绑定。

答案 1 :(得分:0)

SQL方法“ IN”不使用数组。
所以:

IN(234) - correct 
IN(234,543) - correct
IN([234,543]) - wrong

您可以尝试将数组转换为字符串,并传递变量$ 1,例如“ 95626、95645、95837”

答案 2 :(得分:0)

[ziparray] .map {| zip | “'#{zip}'”} .join(',')

答案 3 :(得分:-1)

如果x是一个数组,并且x = ['a','b','c']

quotes = (select * from quote in (?), x)
  • 我们不能在SQL参数中使用它
  • x.join(',')返回"a,b,c"。如果它是int,那么这不是问题。
  • 相反,将此数组保存在变量中,然后在SQL参数中使用它。

a = x,然后使用quotes = (select * from quote in (?),a)