题
这个问题在这里已经有一个答案:
- R中的动态“弦” 2个答案
是否可以将值传递到查询中 dbGetQuery
从RMYSQL软件包。
例如,如果我在字符向量中有一组值:
df <- c('a','b','c')
而且我想循环浏览这些值,以从每个值中为每个数据库提取一个特定的值。
library(RMySQL)
res <- dbGetQuery(con, "SELECT max(ID) FROM table WHERE columna='df[2]'")
当我尝试添加对值的引用时,我会收到错误。想知道是否可以在查询中添加R对象的值。
解决方案
一种选择是操纵循环中的SQL字符串。目前,您有一个字符串字面的 'df[2]'
R不被R解释为字符以外的任何东西。我的回答将有一些歧义,因为 df
在您的Q中,显然不是数据框架(它是字符向量!)。这样的事情将做您想要的。
将输出存储在数字向量中:
require(RMySQL)
df <- c('a','b','c')
out <- numeric(length(df))
names(out) <- df
现在我们可以循环浏览 df
执行查询三次。我们可以设置循环两种方法:i) i
作为我们用来引用的数字 df
和 out
, ,或ii) i
作为每个要素 df
反过来(即 a
, , 然后 b
, ,...)。我将在下面显示两个版本。
## Version i
for(i in seq_along(df)) {
SQL <- paste("SELECT max(ID) FROM table WHERE columna='", df[i], "';", sep = "")
out[i] <- dbGetQuery(con, SQL)
dbDisconnect(con)
}
或者:
## Version ii
for(i in df) {
SQL <- paste("SELECT max(ID) FROM table WHERE columna='", i, "';", sep = "")
out[i] <- dbGetQuery(con, SQL)
dbDisconnect(con)
}
您使用的将取决于个人口味。第二(ii)版本要求您在输出向量上设置名称 out
与内部数据相同 out
.
说了这一切,假设您的实际SQL查询类似于您发布的查询,您是否可以在单个SQL语句中执行此操作, GROUP BY
条款,在计算之前对数据进行分组 max(ID)
?在这样的数据库中做简单的事情可能会更快。不幸的是,我没有一个MySQL实例可以玩,并且我的SQL-FU目前很弱,所以我不能给出一个例子。
其他提示
您也可以使用 sprintf
命令解决问题(这是我在构建闪亮应用程序时使用的)。
df <- c('a','b','c')
res <- dbGetQuery(con, sprintf("SELECT max(ID) FROM table WHERE columna='%s'"),df())
沿着这些线路应该有效。