2015-02-13 4 views
1

Не удается понять, как передать значение столбца dataframe в запрос? Запрос работает нормально, если я передаю значение напрямую.R-программирование: RODBC и dataframe

Значения хранятся в df $ number. Названия таблиц изменяются в целях обмена:

dataframe <- sqlQuery(connection, " 
+ SELECT 
+ dimension1, 
+ FROM 
+ table1, 
+ WHERE 
+ dimension1 = df$number ") 

Я получаю ошибку [1] "42S22 904 [Oracle] [ODBC] [Ora] ORA-00904: \" ДФ $ количество \ ": неверный идентификатор \ n "

ответ

4

gsubfn package может выполнять интерполяцию строк в стиле квази-perl. Введение любой функции с fn$, чтобы включить его аргументы этой функции в:

library(gsubfn) 

num <- 3 
dataframe <- fn$sqlQuery(connection, 
     "SELECT dimension1 FROM table1 WHERE dimension1 = $num ") 

В качестве альтернативы использовать paste или sprintf построить строку:

sql <- paste("SELECT dimension1 FROM table1 WHERE dimension1 =", num) 
sqlQuery(connection, sql) 

или

sql <- sprintf("SELECT dimension1 FROM table1 WHERE dimension1 = %d", num) 
sqlQuery(connection, sql) 
0
dataframe <- sqlQuery(connection, paste(" 
+ SELECT 
+ dimension1, 
+ FROM 
+ table1, 
+ WHERE 
+ dimension1 =", df$number)) 
0

SQL-оператор является строкой, поэтому он не может получить к вам доступ r значение dataframe. Для того, чтобы построить строку, которая использует использование значения:

sql.base<-"SELECT dimension1 FROM table1 WHERE dimension1 = " 
sql.completed<-paste0(sql.base,df$number) 
sqlQuery(connection, sql.completed) 

Если вы хотите, чтобы сделать параметризованный запрос SQL т.е. у вас есть несколько строк в df, вы можете свернуть значения полей с запятой и разделителем поместите их в боковые скобки в запросе SQL IN. В качестве альтернативы вы можете использовать пакет RODBCext, который позволит сделать это как

sqlExecute(connection, "SELECT dimension1 FROM table1 WHERE dimension1 = ?", df$number, fetch = TRUE) 

Для получения дополнительной информации о RODBCext, и этот тип SQL, проверить their vignette

+0

Параметризованная именно то, что нужно! RODBCext - это именно то, что нужно. –

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