这个问题在这里已经有一个答案:

是否可以将值传递到查询中 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 作为我们用来引用的数字 dfout, ,或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())

沿着这些线路应该有效。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top