2017-04-13 92 views
2

我的R工作流现在涉及处理大量查询(RPostgreSQL库)。我确实希望将代码轻松地在将来进行维护和管理。如何在R中执行SQL脚本时使用动态值

我开始从单独的.SQL文件(this帮助)加载大型查询,它工作得很好。

然后我开始使用内插的值(that帮助),这意味着我可以写

SELECT * FROM table WHERE value = ?my_value; 

和(装载它成R之后)使用sqlInterpolate(ANSI(), query, value = "stackoverflow")插值它。

现在会发生什么事是我想用这样的

SELECT count(*) FROM ?my_table; 

,但我怎样才能使它发挥作用?默认情况下,sqlInterpolate()只能安全插值。有没有解决方法?

感谢

回答

0

sqlInterpolate()是用于替代值而已,并不像表名称等组成。您可以使用其他模板框架,如brewwhisker

0

?DBI::SQL,你可以阅读:

默认情况下,任何用户提供的输入到查询应使用 要么dbQuoteIdentifier()dbQuoteString()取决于它 是否指的是表或变量名进行转义,或是一个文字字符串。

此外,在this page

您可能还需要dbQuoteIdentifier()如果要创建表或 依赖于用户输入选择要过滤的哪一列。

所以,你可以使用:

sqlInterpolate(ANSI(), 
       "SELECT count(*) FROM ?my_table", 
       my_table = dbQuoteIdentifier(ANSI(), "table_name")) 
# <SQL> SELECT count(*) FROM "table_name"