2015-10-28 2 views
2

В основном я пытаюсь получить часть WHERE инструкции SELECT по unlisting и paste - список, в котором имена списков представляют базу данных. ТАБЛИЧНЫЕ столбцы и соответствующие значения списка равны параметрам для предложения WHERE. Вот упрощенный пример ...Создайте sql-запрос из имен списков и его значений

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() которые могут сделать это в элегантной форме, но я застрял.

ответ

5

Я не знаю, если это элегантный достаточно, но он должен работать:

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' 
+0

очень элегантный ... – WD11

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

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 больше идей. Если вы сделаете это много, для этого нужно запланировать, чтобы создать для него некоторые специализированные инструменты, как я опишу в этом ответе.

 Смежные вопросы

  • Нет связанных вопросов^_^