从列表名称及其值生成 sql 查询
Generate sql query from list names and its values
基本上,我试图通过 unlisting
和 paste
派生 SELECT 语句的 WHERE 部分,其中列表名称代表数据库 TABLE列和相应的列表值等于 WHERE 子句的参数。这是一个简化的例子......
lst <- list(DATE=as.Date('2015-10-25'), NUM="0001", PROD="SOMETHING")
lst
$DATE
[1] "2015-10-25"
$NUM
[1] "0001"
$PROD
[1] "SOMETHING"
理想情况下,这将转换为(有趣的位从 WHERE
之后的第二行开始):
"SELECT SOME_COLUMNS WHERE
DATE = '", lst$DATE, "' AND
NUM = '", lst$NUM, "' AND
PROD = '" lst$PROD ,"'")
我很确定有人知道 apply()
、
的一些奇特组合
paste(..,collapse ="' AND ")
and/or substitute()
可以以一种优雅的形式实现这一点,但我被卡住了。
我不知道这优雅是否足够,但它应该可以工作:
sql <- paste0("SELECT ",
paste0(names(lst),collapse=','),
" WHERE\n",
paste(lapply(names(lst),function(x)paste0(x," = '",lst[[x]],"'")),collapse="AND\n"))
> cat(sql)
SELECT DATE,NUM,PROD WHERE
DATE = '2015-10-25'AND
NUM = '0001'AND
PROD = 'SOMETHING'
您在找这样的东西吗?
lst2sql <- function(lst) {
sql <- "SELECT col1, col2 FROM table1 WHERE"
predicates <- vapply(names(lst), function(n) { paste(n, " = '", lst[[n]], "'", sep="") }, character(length(names)))
paste(sql, paste(predicates, collapse=" AND "))
}
在您的示例列表上调用时将生成:
"SELECT col1, col2 FROM table1 WHERE DATE = '2015-10-25' AND NUM = '0001' AND PROD = 'SOMETHING'"
sprintf
一般有用:
lst <- list(DATE=as.Date('2015-10-25'), NUM="0001", PROD="SOMETHING")
q <- "SELECT SOME_COLUMNS WHERE DATE = '%s' AND NUM = '%s' AND PROD = '%s'"
> sprintf(q,lst[[1]],lst[[2]],lst[[3]])
[1] "SELECT SOME_COLUMNS WHERE DATE = '2015-10-25' AND NUM = '0001' AND PROD = 'SOMETHING'"
此外,请参阅我的其他回答 here 以了解更多想法。如果你经常这样做,那么为它构建一些专门的工具是值得的,正如我在那个答案中概述的那样。
基本上,我试图通过 unlisting
和 paste
派生 SELECT 语句的 WHERE 部分,其中列表名称代表数据库 TABLE列和相应的列表值等于 WHERE 子句的参数。这是一个简化的例子......
lst <- list(DATE=as.Date('2015-10-25'), NUM="0001", PROD="SOMETHING")
lst
$DATE
[1] "2015-10-25"
$NUM
[1] "0001"
$PROD
[1] "SOMETHING"
理想情况下,这将转换为(有趣的位从 WHERE
之后的第二行开始):
"SELECT SOME_COLUMNS WHERE
DATE = '", lst$DATE, "' AND
NUM = '", lst$NUM, "' AND
PROD = '" lst$PROD ,"'")
我很确定有人知道 apply()
、
paste(..,collapse ="' AND ")
and/or substitute()
可以以一种优雅的形式实现这一点,但我被卡住了。
我不知道这优雅是否足够,但它应该可以工作:
sql <- paste0("SELECT ",
paste0(names(lst),collapse=','),
" WHERE\n",
paste(lapply(names(lst),function(x)paste0(x," = '",lst[[x]],"'")),collapse="AND\n"))
> cat(sql)
SELECT DATE,NUM,PROD WHERE
DATE = '2015-10-25'AND
NUM = '0001'AND
PROD = 'SOMETHING'
您在找这样的东西吗?
lst2sql <- function(lst) {
sql <- "SELECT col1, col2 FROM table1 WHERE"
predicates <- vapply(names(lst), function(n) { paste(n, " = '", lst[[n]], "'", sep="") }, character(length(names)))
paste(sql, paste(predicates, collapse=" AND "))
}
在您的示例列表上调用时将生成:
"SELECT col1, col2 FROM table1 WHERE DATE = '2015-10-25' AND NUM = '0001' AND PROD = 'SOMETHING'"
sprintf
一般有用:
lst <- list(DATE=as.Date('2015-10-25'), NUM="0001", PROD="SOMETHING")
q <- "SELECT SOME_COLUMNS WHERE DATE = '%s' AND NUM = '%s' AND PROD = '%s'"
> sprintf(q,lst[[1]],lst[[2]],lst[[3]])
[1] "SELECT SOME_COLUMNS WHERE DATE = '2015-10-25' AND NUM = '0001' AND PROD = 'SOMETHING'"
此外,请参阅我的其他回答 here 以了解更多想法。如果你经常这样做,那么为它构建一些专门的工具是值得的,正如我在那个答案中概述的那样。