5

dbGetQuery是否可以从 RMySQL 包中将值传递到查询中。

例如,如果我在字符向量中有一组值:

df <- c('a','b','c')

我想遍历这些值以从数据库中为每个值提取一个特定的值。

library(RMySQL)    
res <- dbGetQuery(con, "SELECT max(ID) FROM table WHERE columna='df[2]'")

当我尝试添加对值的引用时,出现错误。想知道是否可以在查询中添加来自 R 对象的值。

4

2 回答 2

4

一种选择是在循环中操作 SQL 字符串。目前你有一个字符串文字,'df[2]'R不会将它解释为字符以外的任何东西。我的回答会有一些模棱两可的地方,因为df在你的 Q 中显然不是数据框(它是一个字符向量!)。像这样的东西会做你想做的事。

将输出存储在数值向量中:

require(RMySQL)
df <- c('a','b','c')
out <- numeric(length(df))
names(out) <- df

现在我们可以遍历元素df来执行你的查询三遍。我们可以通过两种方式设置循环:i) 用i一个数字来引用 and 的元素dfout或者 ii)依次i作为 的每个元素(即, then , ...)。我将在下面展示这两个版本。dfab

## 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 目前很弱,所以我不能给出这个例子。

于 2010-11-27T08:59:51.743 回答
3

您也可以使用该sprintf命令来解决问题(这是我在构建 Shiny Apps 时使用的)。

df <- c('a','b','c')

res <- dbGetQuery(con, sprintf("SELECT max(ID) FROM table WHERE columna='%s'"),df())

沿着这些思路的东西应该起作用。

于 2013-12-12T22:40:44.543 回答