向RMySQL getQuery添加动态值

ana*_*rce 5 r rmysql

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

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

df <- c('a','b','c')
Run Code Online (Sandbox Code Playgroud)

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

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

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

Rei*_*son 4

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

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

require(RMySQL)
df <- c('a','b','c')
out <- numeric(length(df))
names(out) <- df
Run Code Online (Sandbox Code Playgroud)

现在我们可以循环 的元素df来执行查询三次。我们可以通过两种方式设置循环:i) 作为i一个数字,我们用它来引用df和的元素out,或者 ii)依次使用i的每个元素df(即a、then 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)
}
Run Code Online (Sandbox Code Playgroud)

或者:

## Version ii
for(i in df) {
    SQL <- paste("SELECT max(ID) FROM table WHERE columna='", i, "';", sep = "")
    out[i] <- dbGetQuery(con, SQL)
    dbDisconnect(con)
}
Run Code Online (Sandbox Code Playgroud)

您使用哪种取决于个人品味。第二个 (ii) 版本要求您在输出向量上设置out与 中的数据相同的名称out

话虽如此,假设您的实际 SQL 查询与您发布的查询类似,您不能在单个 SQL 语句中使用子句来执行此操作,GROUP BY在计算之前对数据进行分组max(ID)吗?像这样在数据库中做简单的事情可能会快得多。不幸的是,我没有可用的 MySQL 实例,而且我的 SQL-fu 目前很弱,所以我无法给出这样的例子。

  • 当然要记住确保变量中没有任何可能破坏 SQL 语法的内容。强制性 XKCD 参考:http://xkcd.com/327/ (2认同)