【问题标题】:Add a dynamic value into RMySQL getQuery [duplicate]将动态值添加到 RMySQL getQuery [重复]
【发布时间】:2011-05-16 11:53:55
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

标签: r rmysql


【解决方案1】:

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

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

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

现在我们可以遍历df 的元素来执行您的查询3 次。我们可以通过两种方式设置循环: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 目前很弱,所以我不能给出这个例子。

【讨论】:

  • @Gavin,我想不到你在上一段中提到的查询是:SELECT max(ID), columna FROM table WHERE columna in ('a','b','c') GROUP BY columna
  • 记住当然要确保你的变量中没有任何会破坏 SQL 语法的东西。强制性 XKCD 参考:xkcd.com/327
  • @Spacedman,小鲍比桌......经典!
  • 感谢您在帖子中提供的详细信息。它非常有帮助,我再次从中学到了很多东西。关于在我的 SQL 语句中是否需要 GROUP BY 子句,因为这个 ID 是一个数字自动增量器和主键,所以该列中只能有不同的值,所以我不需要 GROUP BY。
  • @analyticsPierce:我认为你错过了GROUP BY 的重点。我的想法是,Joshua Ulrich 为我们输入 SQL,您可以返回一个数据框,其中一列中有 3 个 max(ID) 值和 columna (a,b,c)在第二列中,来自 single SQL 语句。所以不需要循环执行三个 SQL 语句。做一个语句,让数据库做这项工作,然后在 R 端提取你想要的值。这大大减少了工作量、打字和计算时间。
【解决方案2】:

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

df &lt;- c('a','b','c')

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

类似的东西应该可以工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-08
    • 2015-01-09
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-25
    相关资源
    最近更新 更多