2015-04-30 48 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%')"