将R Vector传递给Sql查询

时间:2017-12-15 14:16:41

标签: sql r rodbc

我使用RODBC包来访问我在R中的sql数据库。我还没有找到有关如何将矢量从R传递到sql作为向量的任何有用信息。

    id <- ('00003', '00100')
    query <- sqlQuery(channel = channel, query = "select *
                  from prod_cust_vw.store_dim
                  where store_num in id")

我想将id向量传递给sql而不是硬编码。

4 个答案:

答案 0 :(得分:6)

1)sprintf id转换为适合包含在SQL语句中的字符串,然后使用sprintf将其插入sql字符串中。请参阅?sprintf

id <- c('00003', '00100')
idString <- toString(sprintf("'%s'", id))  # "'00003', '00100'"
sql_fmt <- "select * from prod_cust_vw.store_dim where store_num in (%s)"
sql <- sprintf(sql_fmt, idString)
sql
## [1] "select * from prod_cust_vw.store_dim where store_num in ('00003', '00100')"

2)fn $ 或使用gsubfn包中的fn$。使用sqlQueryfn$(或任何R函数)进行前缀会导致扫描实际参数并将$变量替换为其内容(其中变量名称应仅包含字母和数字,以便区分他们和其他字符串之间)。请参阅?fn

library(gsubfn)

fn$sqlQuery(channel = channel, query = "select *
       from prod_cust_vw.store_dim
       where store_num in ($idString)")

答案 1 :(得分:0)

我是这样做的。

library("RODBC")


dbhandle <- odbcDriverConnect('driver={SQL Server};server=Your_Server_Name;database=Your_Database_Name;trusted_connection=true')

currTableSQL<-paste("SELECT * FROM Your_Table",sep="")

currTableDF<-sqlQuery(dbhandle,currTableSQL)

答案 2 :(得分:0)

新的dbplyr包具有最佳答案。它允许使用任何R对象,并自动将其转换为SQL

https://db.rstudio.com/dplyr/

答案 3 :(得分:0)

我想尝试弄清楚如何使用R Notebook SQL块来做到这一点,但是还没有弄清楚。我在使用其他方法时遇到很多麻烦。这对我有用。

library(RODBC)
myconn<-odbcConnect(dsn = "Data Source Name", 
                uid = rstudioapi::askForPassword("User ID"), 
                pwd = rstudioapi::askForPassword("Database password"))

id<-('00003', '00100') # vector of ID's

id<-paste0(personid, collapse = ", ") #create string for entry into query

query<-paste("select *
              from prod_cust_vw.store_dim
              where store_num in (", id,")", sep = "") #query -- use "paste". I have not tried with "paste0")

data<-sqlQuery(myconn,query)    #obtain the data by applying the query through the connection.