2015-04-30 84 views
2

我正在運行一個從MySQL獲取查詢的R腳本。查詢本身是功能性的,但依賴於變量「N」。使用sprintf將變量插入到SQL查詢中的問題

要將此變量添加到我的SQL代碼中,我使用sprintf通過在需要的位置鍵入'%s'來插入它。然而,我的查詢也包括這些LIKE語句的多個:

FROM Receipts

WHERE RetailerID

IN( '%s' 的)#這是其中 「N」 被放置

AND(Date LIKE'%01/07/2014%')

我確信這是第我的查詢沒有運行的原因。當它到達這些LIKE命令時,sprintf命令有問題,可能認爲它與'%s'類似。

有誰知道如何解決這個問題,以便'%01/07/2014%'仍然被打印到SQL查詢中?我嘗試過使用「%%」這樣的轉義,'%% 01/07/2014 %%',但它仍然不起作用。

有沒有一種方法可以格式化sprintf,以便知道跳過這些?

謝謝!

+0

你可以使用兩個'%s'其中第二是日期,然後將日期以及 –

+0

請不要標籤垃圾 –

+0

你不應該用sprintf構建SQL查詢。 – developerwjk

回答

2

爲了讓@ cryo111的評論明確的答案:

使用gsub這樣的:

N=10 
query="select * from table where [email protected]" 
gsub("@N",N,query) 
0

您可以使用RMySQL's dbEscapeString與sprintf的處理佔位符。

require(RMySQL) 

con <- dbConnect(MySQL(), dbname = "foobar") 
tmp <- sprintf("SELECT * FROM someField WHERE someOtherField = %s", "sometext") 
dbEscapeStrings(con, tmp) 
1

sprintf工作正常,我提供我逃避%跡象:

x <- "from receipts where retailerid in ('%s') and (date like '%%01/07/2014%%')" 
> sprintf(x,"a") 
[1] "from receipts where retailerid in ('a') and (date like '%01/07/2014%')" 

以上運行對我蠻好。不過,一般來說,我不會推薦sprintf而不是gsub,因爲它會很快變得麻煩。

1

我傾向於使用粘貼sql查詢。所以你的情況我會使用類似:

paste("select * from Receipts where RetailerID in(",as.character(N),") and (date like '%01/07/2014%')"