簡體   English   中英

在 R 腳本中傳遞字符串變量以在 SQL 語句中使用它

[英]Pass string variable in R script to use it in SQL statement

我嘗試在 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)

我用 number 測試了它,它運行良好,但是當我使用 string 時它不起作用,因為該值必須在引號中' '

使用sprintf代替:

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

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

試試這個:

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)

編輯窗口

嘗試

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程序包可能有類似的輔助函數postgresqlEscapeStringsRPostgreSQLdbEscapeStringsRMySQL

使用glue 包中的glue_sql()。

x = "通過"

glue_sql("select ID, NAME, STATUS from STUDENT where STATUS = {x}", .con = con)

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM