将 R 变量传递给 RODBC sql 查询? [复制]

Posted

技术标签:

【中文标题】将 R 变量传递给 RODBC sql 查询? [复制]【英文标题】:Pass R variable to RODBC's sqlQuery? [duplicate] 【发布时间】:2010-12-01 23:08:16 【问题描述】:

有没有办法将 R 中定义的变量传递给 RODBC 包中的 sqlQuery 函数?

具体来说,我需要将此类变量传递给标量/表值函数、存储过程和/或可能是 SELECT 语句的 WHERE 子句。

例如,让:

x <- 1 ## user-defined

那么,

example <- sqlQuery(myDB,"SELECT * FROM dbo.my_table_fn (x)")

或者……

example2 <- sqlQuery(myDB,"SELECT * FROM dbo.some_random_table AS foo WHERE foo.ID = x")

或者……

example3 <- sqlQuery(myDB,"EXEC dbo.my_stored_proc (x)")

显然,这些都不起作用,但我认为有些东西可以实现这种功能。

【问题讨论】:

How to add a dynamic value into Rmysql getQuery 和 Dynamic string in R 和 RSQLite query with user specified variable in the WHERE field 的副本 【参考方案1】:

构建您打算传递的字符串。所以不是

example <- sqlQuery(myDB,"SELECT * FROM dbo.my_table_fn (x)")

example <- sqlQuery(myDB, paste("SELECT * FROM dbo.my_table_fn (", 
                                x, ")", sep=""))

这将填写x的值。

【讨论】:

但请记住,如果您的 x 值类似于 col); DELETE * FROM my_table_fn; SELECT * FROM my_table_fn (col,则会产生可怕的后果。这就是为什么使用占位符比使用paste() 好得多的原因。有些驱动程序支持占位符,有些则不支持。 在@Dirk 的答案上扩展(可能会改进),您可以使用sprintf() 来构建您的字符串,我发现它比paste() 更容易阅读,例如example &lt;- sqlQuery(myDB, sprintf("SELECT * FROM dbo.my_table_fn (%s)", x))。对于单变量替换,sprintf()paste() 之间的区别不是什么大问题,但对于多变量替换,它变得更加重要,例如sqlQuery(myDB, sprintf("SELECT * FROM orders WHERE order_date &gt;= '%s' AND order_date &lt; '%s' AND customer_id = %s", start.date, end.date, customer.id))【参考方案2】:

如果您使用 sprintf,您可以使用变量替换非常轻松地构建查询字符串。为了更加易于使用,如果您预先解析该查询字符串(我使用的是 stringr),您可以将它写在代码中的多行中。

例如

q1 <- sprintf("
               SELECT basketid, count(%s)
               FROM %s
               GROUP BY basketid
              "
              ,item_barcode
              ,dbo.sales
              )
q1 <- str_replace_all(str_replace_all(q1,"\n",""),"\\s+"," ")
df <- sqlQuery(shopping_database, q1)

对另一个 R 小伙的旁注和帽子提示

最近我发现我想通过使用类似 Python 的 string.format() 函数来简化变量替换,它可以让你在字符串中重用和重新排序变量

例如

$: w = "He001 W1r0d".format("l","o")
$: print(w)
"Hello World"

但是,R 中似乎不存在此功能,因此我在 Twitter 上四处询问,一位非常有帮助的小伙子 @kevin_ushey 回复了他自己的 custom function 以在 R 中使用。看看吧!

【讨论】:

【参考方案3】:

使用更多变量执行此操作:

  aaa <- "
      SELECT   ColOne, ColTwo 

FROM    TheTable 

 WHERE  HpId =  AAAA            and

  VariableId = BBBB     and 

  convert (date,date )  < 'CCCC'
  "


--------------------------

  aaa <- gsub ("AAAA",  toString(111),aaa)

  aaa <- gsub ("BBBB",  toString(2222),aaa)

  aaa <- gsub ("CCCC",  toString (2016-01-01) ,aaa)

【讨论】:

【参考方案4】:

试试这个

x <- 1
example2 <- fn$sqlQuery(myDB,"SELECT * FROM dbo.some_random_table AS foo WHERE foo.ID = '$x'")

【讨论】:

Error: object 'fn' not found 我怀疑它使用的是gsubfn

以上是关于将 R 变量传递给 RODBC sql 查询? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

使用 rodbc 包从 R 查询 sql server。需要将日期/时间值作为 where 语句的一部分传递到 sqlQuery

R 编程:RODBC 和数据框

SQL查询丢失信息

使用变量约束的 sqlQuery 不起作用。

以编程方式构建 SQL 查询 R/Shiny/RODBC

使用 R RODBC 参数化 SQL 查询