我尝试在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)
我用数字测试它并且它运行良好但是当我使用字符串时它不起作用,因为值必须在引号' '
中。
答案 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
中的RPostgreSQL
或dbEscapeStrings
中的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