如何从 R 的 sqlInterpolate 函数中删除嵌入的引号?
How do I remove embedded quotes from sqlInterpolate function of R?
我正在尝试使用 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 table 名称和列名称。因此,注入值 (?x, ?y) 作为变量传递。
我查了这个 link 最接近找到我的解决方案,但老实说,我不明白。 [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)
我正在尝试使用 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 table 名称和列名称。因此,注入值 (?x, ?y) 作为变量传递。
我查了这个 link 最接近找到我的解决方案,但老实说,我不明白。 [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)