【问题标题】:adding array as parameter to sql query in ruby在ruby中将数组作为参数添加到sql查询
【发布时间】:2019-03-03 04:54:18
【问题描述】:

我有一个数组

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'])

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

【问题讨论】:

  • res1 = conn.exec(sql, [ziparray].join(',')) 应该可以工作。
  • 我正在尝试使用str = ziparray.join("','") 将其转换为字符串。我得到的输出是95626','95645','95837。缺少开始和结束引号。如何在这里使用join?
  • [ziparray].map { |zip| "'#{zip}'" }.join(',')

标签: ruby postgresql pg


【解决方案1】:

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

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

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

【讨论】:

  • 我正在尝试使用str = ziparray.join("','") 将其转换为字符串。我得到的输出是95626','95645','95837。缺少开始和结束引号。如何在这里使用join?
  • ["2", "3", "4"].join(',') 它是返回 "2,3,4"
  • 在我的 IN 它的字符串参数不是 int 。我需要每个值都用单引号。
  • ["2", "3", "4"].to_s[1..-2] 这如你所愿返回,但我不喜欢这种方式)
【解决方案2】:

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

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

然后就可以使用普通的参数绑定了。

【讨论】:

  • 您的更新与我的回答无关。我正在创建多个占位符,每个占位符代表数组中的一个值。
  • 这是要走的路。
  • @themaster 您通过conn.exec(sql, ziparray) 调用查询——无需自己转换ziparray。
  • @Stefan 是的 .. 我有点困惑。这行得通。非常感谢
【解决方案3】:

如果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)

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-04
      • 2022-11-04
      • 2019-03-24
      • 1970-01-01
      • 2016-01-04
      • 1970-01-01
      相关资源
      最近更新 更多