我正在尝试使用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)

08-19 20:30