4

我正在尝试使用函数生成一堆 SQL 脚本,DBI::sqlInterpolate但由于脚本嵌入了与 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]

4

1 回答 1

2

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)
于 2017-08-16T12:23:46.103 回答