我想做一些与这些非常类似的事情:
When mysql WHERE clause is empty, return all rows
Possible to have PHP MYSQL query ignore empty variable in WHERE clause?
如果我按子集化的变量是NULL
,我希望忽略where子句。但是,我使用dbGetQuery从R访问我的MySQL数据库。到目前为止,我有这样的代码
write_pid_clause = function(p_id=NULL){
if(is.null(p_id)){return(NULL)}
else {return(paste0("where project_id = ",p_id) )}
}
如果未指定where
,则会写入正确的p_id
语句行为以及代码:
dbGetQuery( con,paste0("select MIN(completion_date) from run ",write_pid_clause(p_id))))
这是正常的,但是,如果我想在where子句中插入更多条件,我会很困难,例如如果我想在and status = 'complete'
时添加条件p_id = NULL
。
有没有人对如何在R中优雅地做到这一点有任何好的想法?
修改
这里有一些代码来演示我想要做的事情,这是关于连接后的and
子句(执行where
有点棘手)
make_and_clauses = function(p_id = "",start_date="", end_date=""){
conditions = list(
list(" and r.project_id ='", p_id,"'"),
list(" and r.completion_date >= '",start_date,"'"),
list(" and r.completion_date <= '", end_date, "'"))
condition_values = c(p_id,start_date, end_date)
conditions[which(condition_values =="")] <- ""
conditions = unlist(conditions,recursive=TRUE)
paste0(conditions,collapse="")
}
给出输出
> make_and_clauses(2,3,4)
[1] " and r.project_id ='2' and r.completion_date >= '3' and r.completion_date <= '4'"
> make_and_clauses(2,,4)
[1] " and r.project_id ='2' and r.completion_date <= '4'"
> make_and_clauses(,3,2)
[1] " and r.completion_date >= '3' and r.completion_date <= '2'"
>
答案 0 :(得分:1)
我不认为有一种简单/简单/清晰的方法可以达到你想要的效果。如果您希望能够添加多个子句,每个子句都依赖于变量的内容,则必须构建每个子句。我能想到的唯一相关的SQL技巧是将WHERE 1=1
放在SQL语句中,然后为每个值添加AND column = value
。这样,如果你留下一个,语法仍然是正确的。
我看到@Marek提供了代码答案;也许你可以结合答案来产生一个可行的解决方案。
答案 1 :(得分:1)
从你的功能开始我提出了类似的内容:
make_and_clauses <- function(p_id, start_date, end_date) {
conditions = c(
if (!missing(p_id)) sprintf("r.project_id ='%i'", p_id),
if (!missing(start_date)) sprintf("r.completion_date >= '%i'", start_date),
if (!missing(end_date)) sprintf("r.completion_date <= '%i'", end_date)
)
paste(conditions, collapse=" and ")
}
返回:
make_and_clauses(2,3,4)
# [1] "r.project_id ='2' and r.completion_date >= '3' and r.completion_date <= '4'"
make_and_clauses(2,,4)
# [1] "r.project_id ='2' and r.completion_date <= '4'"
make_and_clauses(,3,2)
# [1] "r.completion_date >= '3' and r.completion_date <= '2'"
make_and_clauses(,3,)
# [1] "r.completion_date >= '3'"
没有任何论据可以带来什么重要:
make_and_clauses(,,)
# [1] ""
因此可以编写WHERE
子句:
make_and_clauses <- function(p_id, start_date, end_date) {
conditions = c(
if (!missing(p_id)) sprintf("r.project_id ='%i'", p_id),
if (!missing(start_date)) sprintf("r.completion_date >= '%i'", start_date),
if (!missing(end_date)) sprintf("r.completion_date <= '%i'", end_date)
)
if (length(conditions)>0) paste("WHERE", paste(conditions, collapse=" and ")) else ""
}
并将其用作
paste("select MIN(completion_date) from run", make_and_clauses(,3,2))
# [1] "select MIN(completion_date) from run WHERE r.completion_date >= '3' and r.completion_date <= '2'"
paste("select MIN(completion_date) from run", make_and_clauses())
# [1] "select MIN(completion_date) from run "