Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在ruby中向sql查询添加数组作为参数_Ruby_Postgresql_Pg - Fatal编程技术网

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

在ruby中向sql查询添加数组作为参数,ruby,postgresql,pg,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,它不带双引号。我认为这就是问题所在。 如何做到这一点 更新 我可以使用

我有一个数组

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', '95625'])
这正是我将数组转换为字符串时所做的。我想这不是使用参数的正确方法。
还有其他方法吗。

中的SQL方法不使用数组。 因此:


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

中的SQL方法不使用数组。 因此:


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

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

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

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

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

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)"
然后可以使用普通的参数绑定。

如果x是数组,x=['a','b','c']

我们不能在SQL参数中使用它 x、 join',返回a、b、c。如果是int,这不是问题。 相反,将此数组保存在变量中,并在SQL参数中使用它。 a=x,然后使用quotes=select*from quote in,如果x是数组且x=['a','b','c']

我们不能在SQL参数中使用它 x、 join',返回a、b、c。如果是int,这不是问题。 相反,将此数组保存在变量中,并在SQL参数中使用它。

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

[ziparray].map{zip}.join'.

[ziparray].map{zip}.join'.

res1=conn.execsql[ziparray].join',应该可以工作。我正在尝试使用str=ziparray.join'.'将其转换为字符串。我得到的输出是95626'.'95645'.'957'。缺少起始引号和结束引号。如何在此处使用join?[ziparray].map{zip}.join','res1=conn.execsql,[ziparray].join','应该可以。我正在尝试使用str=ziparray.join','将其转换为字符串。我得到的输出是95626','95645','95837。缺少起始引号和结束引号。如何在这里使用join?[ziparray].map{zip}{zip}}.join','我正在尝试使用str=ziparray.join','将其转换为字符串。我得到的输出是95626','95645','95837。缺少起始引号和结束引号。如何在这里使用join?[2,3,4]。join',它在我的字符串参数中返回2,3,4,而不是int。我需要在每个值上加上单引号。[2,3,4]。to_[1..-2]这返回了您想要的结果,但我不喜欢这种方式,我正在尝试使用str=ziparray.join',将其转换为字符串。我得到的输出是95626',95645',95837。缺少起始引号和结束引号。如何在此处使用join?[2,3,4]。join',“它在我的字符串参数中返回2,3,4,而不是int。我需要在每个值上加上单引号。[2,3,4]。to_[1..-2]这返回了您想要的结果,但我不喜欢这种方式。您的更新与我的答案无关。我正在创建多个占位符,每个占位符对应数组中的一个值。这就是方法。@您可以通过conn.execsql、ziparray调用查询的主控程序–无需自己转换ziparray。@Stefan是。。我有点困惑。这很有效。非常感谢这里还有一个问题。你的更新与我的答案无关。我正在创建多个占位符,每个占位符对应数组中的一个值。这就是方法。@您可以通过conn.execsql、ziparray调用查询的主控程序–无需自己转换ziparray。@Stefan是。。我有点困惑。这很有效。多谢了,还有一个问题。
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)"
quotes = (select * from quote in (?), x)