R RODBC将数字列表放入IN()语句中

时间:2011-12-26 21:27:33

标签: sql r rodbc

我已经查看了'Pass R variable to RODBC's sqlQuery with multiple entries?',但似乎无法让它发挥作用。我正在尝试在SQL Server 2008 R2 db上从R执行sqlQuery()。我正在尝试从基于行号的大型数据库中获取样本。首先,我创建了一个随机数列表:

sampRowNum <- sample(seq(1,100000,1), 5000)

然后我尝试在查询中使用这些数字:

query1 <- sqlQuery(channel, paste("select *      
  FROM db where row_id in (", sampRowNum,")", sep=""))

我只得到数据库中row_id等于sampRowNum中第一个数字的结果。有什么建议吗?

1 个答案:

答案 0 :(得分:8)

你没有正确paste你的查询。

如果你单独运行paste语句,你会看到你得到一个长度为5000的向量,所以sqlQuery只执行其中的第一个,对应于第一个元素samRowNum

你想做的事情更像是这样:

paste("select * FROM db where row_id in (", 
    paste(sampRowNum,collapse = ","),")", sep="")

正如一个补充说明(因为我不得不做很多这样的事情......)用带有字符串的IN子句构造sql查询有点麻烦,因为你有解决所有单引号:

vec <- letters[1:5]

paste("SELECT * FROM db WHERE col IN ('",
    paste(vec,collapse = "','"),"')",sep = "")

[1] "SELECT * FROM db WHERE col IN ('a','b','c','d','e')"

如果你这么做了,你最终会写一个小函数来为你做贴字的字符向量。

与往常一样,如果由于SQL注入攻击而处理用户输入(例如在Web应用程序中),这种SQL字符串操作不好。在我的特殊情况下,这并不是一个问题,但一般来说,如果您对输入值没有太多控制,人们会更喜欢参数化查询。