我有一个与SQL Server Management Studio一起使用的.sql文件。我在我的R脚本中使用相同的文件将数据直接拉入R(如下所示),这很有效。
List<Function<Product,Info>> functions = new ArrayList<>();
我需要的是在R环境中将值生成的附加条件插入.sql文件中使用R的 WHERE 子句的开头。我在下面解决了这个问题的方法:
query <- paste(readLines("SQL_FILE.sql"), collapse="\n") # read sql query from hard drive
con <- odbcConnect(dsn ="DATABASE_NAME") # connect to database
dt <- sqlQuery(con, query, rows_at_time = 1, stringsAsFactors = FALSE)
输出是:
queryStart <- "SELECT * FROM ANALYSIS_VIEW A WHERE 1=1 AND A.COLUMN_X IN("
filteringValuesForX <- c("FILTERING_VALUE_X1", "FILTERING_VALUE_X2")
queryEnd <- ") AND A.COLUMN_Y = 'FILTERING_VALUE_Y1';"
query <-
paste0(queryStart,
toString(paste("'",filteringValuesForX ,"'", sep='')),
queryEnd)
query
但是,由于以下原因,我正在寻找更好的解决方案:
注意:原始.sql文件中还有其他 WHERE 子句。但是,我希望此更新仅适用于一个特定的 WHERE 子句。为了指出这个特定的一个,我添加了声明“1 = 1”。
有什么建议吗?
答案 0 :(得分:0)
我想我找到了办法! 但在接受我的解决方案作为答案之前,我会再等一天,看看是否有更好的答案。所以,请随意提出其他方法。
replaceWithThis <- paste(" A.COLUMN_X IN(", toString(paste("'",filteringValuesForX ,"'", sep='')), ")", " ", collapse = "\n")
query <- sub(x = query, pattern = "1=1 AND A.COLUMN_X IN('FILTERING_VALUE_X1', 'FILTERING_VALUE_X2') ", replacement = replaceWithThis)
query
对于此示例,为了避免duplicete WHERE 条件,我使用了pattern = "1=1 AND A.COLUMN_X IN('FILTERING_VALUE_X1', 'FILTERING_VALUE_X2') "
。在原始数据中,替换1=1
就足够了。
输出结果为:
"SELECT * FROM ANALYSIS_VIEW A WHERE 1=1 AND A.COLUMN_X IN('FILTERING_VALUE_X1', 'FILTERING_VALUE_X2') AND A.COLUMN_Y = 'FILTERING_VALUE_Y1';"