我正在尝试使用DBI::sqlInterpolate
函数生成一堆SQL脚本,但是由于脚本嵌入用R变量返回的引号,因此不断出现SQL错误。
这是代码:
> x<-'state_transtions'
> y<-'transition_time'
> script<-"select * from ?x WHERE DATE(?y)> DATE_SUB(NOW(), INTERVAL 1 DAY)"
> sqlInterpolate(ANSI(),script,x=x,y=y)
#<SQL> select * from 'state_transtions' WHERE DATE('transition_time')> DATE_SUB(NOW(), INTERVAL 1 DAY)
如您所见,我正在通过R代码生成所需的SQL表名和列名。因此,喷射值(Δx,Δy)作为变量传递。
我查找了最接近该链接的链接,但实际上,我不理解。 [https://rstats-db.github.io/DBI/reference/sqlParseVariables.html#examples]
最佳答案
1)gsubfn软件包中的gsubfn gsubfn
可以进行替换。这里的正则表达式匹配一个问号,后跟单词字符,然后它使用第二个自变量中定义的对应关系,对正则表达式中与括号内的部分匹配的部分进行替换。
library(gsubfn)
gsubfn("[?](\\w+)", list(x = x, y = y), script)
给出以下内容:
[1] "select * from state_transtions WHERE DATE(transition_time)> DATE_SUB(NOW(), INTERVAL 1 DAY)"
2)fn $ gsubfn软件包还提供了
fn$
,它可以在任何函数之前加上前缀,并将对其参数进行字符串插值,以得到相同的结果。 identity
可以用任何其他合适的R函数代替。它用名为x的变量的内容替换字符串中的$ x(其中x可以是仅由字母和数字组成的任何名称)。
library(gsubfn)
script2 <- "select * from $x WHERE DATE($y)> DATE_SUB(NOW(), INTERVAL 1 DAY)"
fn$identity(script2)
gsubfn软件包由sqldf自动加载,并且经常与之一起使用,例如,
library(sqldf)
var <- "Time"
fn$sqldf("select $var from BOD where $var > `mean(1:7)`")
给予:
Time
1 5
2 7
3)sprintf 也可以仅使用
sprintf
而无需任何软件包来执行此操作sprintf("select * from %s WHERE DATE(%s)> DATE_SUB(NOW(), INTERVAL 1 DAY)", x, y)