使用R将其他WHERE条件插入到.sql文件中

时间:2018-03-20 10:32:54

标签: r string insert

我有一个与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

但是,由于以下原因,我正在寻找更好的解决方案:

  1. 它不是动态的;当我使用SQL Server Management Studio更新.sql文件时,我还需要手动更新 queryStart queryEnd 变量。
  2. 实际的SQL脚本很长,我不希望看到R脚本中的所有SQL代码。
  3. 注意:原始.sql文件中还有其他 WHERE 子句。但是,我希望此更新仅适用于一个特定的 WHERE 子句。为了指出这个特定的一个,我添加了声明“1 = 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';"