我已经查看了'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
中第一个数字的结果。有什么建议吗?
答案 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字符串操作不好。在我的特殊情况下,这并不是一个问题,但一般来说,如果您对输入值没有太多控制,人们会更喜欢参数化查询。