Start with your function I proposed something like:
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 ")
}
which returns:
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'"
What important that no arguments at all leads to:
make_and_clauses(,,)
# [1] ""
So it's possible to write WHERE
clause:
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 ""
}
and use it as
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 "