7

我已经查看了“将R 变量传递给具有多个条目的 RODBC 的 sqlQuery”?' 已经但似乎无法让它发挥作用。我正在尝试sqlQuery()在 SQL Server 2008 R2 db 上执行 from R。我正在尝试根据行号从大型数据库中获取样本。首先,我创建了一个随机数列表:

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

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

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

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

4

1 回答 1

11

您没有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')"

如果你经常这样做,你最终会编写一个小函数来为你粘贴字符向量。

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

于 2011-12-26T22:33:31.737 回答