从列表名称及其值生成 sql 查询

Posted

技术标签:

【中文标题】从列表名称及其值生成 sql 查询【英文标题】:Generate sql query from list names and its values 【发布时间】:2015-10-28 18:05:02 【问题描述】:

基本上,我试图通过unlistingpaste 导出SELECT 语句的WHERE 部分,其中列表名称表示数据库表列,并且相应的列表值等于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 ") 和/或substitute() 可以以优雅的形式实现这一点,但我被卡住了。

【问题讨论】:

【参考方案1】:

我不知道这是否足够优雅,但它应该可以工作:

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'

【讨论】:

【参考方案2】:

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 了解更多想法。如果您经常这样做,那么为它构建一些专门的工具是值得的,正如我在那个答案中所概述的那样。

【讨论】:

【参考方案3】:

你在寻找这样的东西吗?

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'"

【讨论】:

以上是关于从列表名称及其值生成 sql 查询的主要内容,如果未能解决你的问题,请参考以下文章

控制器不断生成带有错误外键名称的 SQL 查询

将值列表从 Python 传递到 SQL 查询的 IN 子句

如何将 SQL 查询中一个字段的值用于 Oracle Apex 上另一个字段的值列表?

使用单元格值范围内的条件运行 SQL 查询列表

进行从多列中选择值列表的 SQL 查询

从视图中的 SQL 子查询返回值列表