将 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 <- sqlQuery(myDB, sprintf("SELECT * FROM dbo.my_table_fn (%s)", x))
。对于单变量替换,sprintf()
和 paste()
之间的区别不是什么大问题,但对于多变量替换,它变得更加重要,例如sqlQuery(myDB, sprintf("SELECT * FROM orders WHERE order_date >= '%s' AND order_date < '%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