在RMySQL getQuery中添加动态值

时间:2010-11-27 08:03:34

标签: r rmysql

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

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

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

我想循环遍历值,从数据库中为每个值提取特定值。

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

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

2 个答案:

答案 0 :(得分:4)

一种选择是操纵循环中的SQL字符串。目前你有一个字符串文字,'df[2]'不会被R解释为除字符以外的任何内容。在我的答案中会有一些含糊之处,因为你的Q中的df显然不是数据框(它是一个字符向量!)。像这样的东西会做你想要的。

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

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)
}

OR:

## 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子句在计算之前对数据进行分组{{ 1}?像这样在数据库中做简单的事情可能会快得多。不幸的是,我没有使用MySQL实例,而且我的SQL-fu目前很弱,所以我不能给出一个这样的例子。

答案 1 :(得分:3)

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

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

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

这些方面应该有所作为。