2013-07-02 77 views
4

我嘗試使用一個字符串變量中的R腳本,可以通過SQL語句,例如使用:傳遞字符串變量使用它在SQL語句中

x="PASS" 

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

的錯誤說:

錯誤在mysqlExecStatement(康涅狄格州,聲明,...):
RS-DBI驅動程序:(無法運行的語句:在未知列 'PASS' 'where子句')

這意味着STATUS =(「,x,」)「= PASS,它必須'加'加上報價''

我試圖把'',但沒有成功,如下所示。

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

我用數字測試,它是工作得很好,但是當我使用的字符串它是不工作的,因爲值必須在引號' '

回答

7

使用sprintf代替:

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

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

感謝dickoa 我試着用sprintf和實在不行,在我來說,我使用含有整數其他變量類型。 我的情況下的更新是: X = 「PASS」 Y = 1100 SQL < - 糊( 「選擇ID,C_ID,NAME,從STUDENT STATUS其中C_ID =(」,Y, 「)」,以及STATUS =(」 X‘)’09月=‘’) 前一種情況可以應付年,但不能用X 請能幫助和感謝事先 – linux

0

編輯窗口

嘗試

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

+0

你可以保持架或刪除他們的工作。 – user1609452

+1

這看起來像是''shQuote''的錯誤使用,它是爲_OS shell_引用字符串。不能保證同樣的引號是數據庫所期望的。 –

3

試試這個:

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) 
+0

謝謝G. Grothendieck,我試過了,它工作的很好與不同類型的變量..我也要感謝所有回覆的人。 – linux