将字符作为参数传递给 R 中的 db 函数

Passing characters as argument into db function in R

我想知道如何在我下面的 R user-defined function 中传递 2 字符 (x,y),希望有人可以提供帮助:

sql.r<-function(x,y){

# Load RODBC package
library(RODBC)

# Create a connection to the database called "con"
con <- odbcConnect("odbccalc", uid=xxx, pwd=xxx, believeNRows=FALSE)

# Check that connection is working (Optional)
odbcGetInfo(con)

# Find out what tables are available (Optional)
Tables <- sqlTables(con, schema="tblData")

# Query the database and put the results into the data frame "dataframe"
dataframe <- sqlQuery(con, "
                    SELECT lbl,Date, dot
                    FROM
                    tblData t
                    WHERE t.lbl="'',x,"''
                    AND t.Date <"'',y,"''
                    ORDER BY t.Date desc")

语法问题可能出在quotes的管理上。

工作语法,以防有帮助:

sqlQuery(con, "
                  SELECT lbl,Date, dot
                  FROM
                  tblData t
                  WHERE t.lbl='fruit'
                  AND   t.Date < '2015-06-01'
                  ORDER BY t.Date desc")

最佳,

您必须通过 pastepaste0 构建查询。试试这个:

 dataframe <- sqlQuery(con, paste0("
                SELECT lbl,Date, dot
                FROM
                tblData t
                WHERE t.lbl='",x,"'
                AND t.Date <'",y,"'
                ORDER BY t.Date desc"))

重点是 sqlQuery 有两个参数:一个 connection 和一个字符串。该字符串是您要执行的 sql 命令。如果命令依赖于某些输入,则必须相应地构建字符串。 pastesprintf 让你做到这一点。您将 xy 变量的值放在表示命令的字符串中。这不是 sql 特定的,只是标准的字符串操作。

正如其他人所说,您可以使用 pastepaste0 来构造查询。但是,sprintf 函数也可以解决这个问题。我认为这稍微更容易阅读,因为您避免使用混合的单引号和双引号。

即在您的函数中执行类似以下操作:

query <- sprintf("SELECT lbl, Date, dot
                 FROM
                 tblData t
                 WHERE t.lbl= '%s'
                 AND   t.Date < '%s'
                 ORDER BY t.Date desc", x, y)
sqlQuery(con, query)