将数组作为参数添加到 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(',')
我有一个数组
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(',')