在R脚本中传递字符串变量以在SQL语句中使用它

时间:2013-07-02 20:16:44

标签: sql r variables

我尝试在R脚本中使用字符串变量来通过SQL语句使用,例如:

x="PASS"

SQL<- paste("select ID, NAME, STATUS from STUDENT where STATUS =(",x,")",sep="")
Q1 <- dbGetQuery(con, SQL)

错误说:

  

mysqlExecStatement(conn,statement,...)出错:
  RS-DBI驱动程序:(无法运行语句:'where子句'中的未知列'PASS')

这意味着STATUS =(“,x,”)“= PASS并且必须'PASS'并添加引号''

我试图放'',但没有成功如下。

SQL <- paste("select ID, NAME, STATUS from STUDENT where STATUS ='(",x,")' ",sep="")
Q1 <- dbGetQuery(con, SQL)

我用数字测试它并且它运行良好但是当我使用字符串时它不起作用,因为值必须在引号' '中。

4 个答案:

答案 0 :(得分:8)

改为使用sprintf

x <- "PASS"
sprintf("select ID, NAME, STATUS from STUDENT where STATUS = '%s'", x)

## [1] "select ID, NAME, STATUS from STUDENT where STATUS = 'PASS'"

答案 1 :(得分:4)

试试这个:

library(gsubfn)
x <- "PASS"

fn$dbGetQuery(con, "select ID, NAME, STATUS from STUDENT where STATUS = '$x' ")

这也有效:

s <- fn$identity("select ID, NAME, STATUS from STUDENT where STATUS = '$x' ")
dbGetQuery(con, s)

答案 2 :(得分:1)

编辑Windows

尝试

x = "PASS"

SQL<- paste0("select ID, NAME, STATUS from STUDENT where STATUS = ", shQuote(x, 'sh'))
Q1 <- dbGetQuery(con, SQL)

更常见的是shQuote对于构造的内容非常有用:

paste0("SELECT * FROM urtable where urvar IN(", paste0(shQuote(LETTERS, 'sh'), collapse = ','), ")")
[1] "SELECT * FROM urtable where urvar IN('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z')"

 #

如果你有简单的字符串。对于更复杂的字符串,可能需要其他方法。例如,在PoSTgreSQL中,您可以使用Dollar-Quoted String Constants来转义字符。

您没有提到您正在使用的SQL变体或关联的R包。某些R包可能具有辅助函数,如postgresqlEscapeStrings中的RPostgreSQLdbEscapeStrings中的RMySQL

答案 3 :(得分:0)

使用胶水包中的胶水_sql()。

x =“通过”

glue_sql(“从学生那里选择ID,名称,状态,其中STATUS = {x}” ,. con = con)

在此处查看更多示例: https://glue.tidyverse.org/#glue_sql-makes-constructing-sql-statements-safe-and-easy