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

adding array as parameter to sql query in ruby

我有一个数组

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

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

sql = "SELECT * from table_name WHERE code in ();"
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'])

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

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

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

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

正如其他人所说,您不能对整个数组进行参数化。改用这个:

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

然后就可以使用正常的参数绑定了

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

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

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

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