2016-01-12 2 views
-1

Мне интересно, как передать 2 символы(x,y) в моем ниже Ruser-defined function, и надеюсь, что кто-то может помочь в этом:Передача символов в качестве аргумента в функции дб в R

sql.r<-function(x,y){ 

# Load RODBC package 
library(RODBC) 

# Create a connection to the database called "con" 
con <- odbcConnect("odbccalc", uid=xxx, pwd=xxx, believeNRows=FALSE) 

# Check that connection is working (Optional) 
odbcGetInfo(con) 

# Find out what tables are available (Optional) 
Tables <- sqlTables(con, schema="tblData") 

# Query the database and put the results into the data frame "dataframe" 
dataframe <- sqlQuery(con, " 
        SELECT lbl,Date, dot 
        FROM 
        tblData t 
        WHERE t.lbl="'',x,"'' 
        AND t.Date <"'',y,"'' 
        ORDER BY t.Date desc") 

Проблема синтаксиса может находятся в управлении quotes.

Рабочий синтаксис, в случае, если это помогает:

sqlQuery(con, " 
        SELECT lbl,Date, dot 
        FROM 
        tblData t 
        WHERE t.lbl='fruit' 
        AND t.Date < '2015-06-01' 
        ORDER BY t.Date desc") 

Бест,

+1

Используйте 'paste' для построения запроса. См. '? Paste'. – nicola

+0

@nicola: не видите точку после проверки, как в 'Matlab', я обычно обрабатываю кавычки в операциях' sql'. Я просто не уверен в 'R'. – owner

+0

@ nrussell: если вы также настаиваете на этом, вы оба можете иметь право. ps: знаете ли вы о какой-либо документации, где проиллюстрирован какой-либо 'sql-синтаксис' в сочетании с' paste'? Я googling это ... – owner

ответ

2

Как утверждают другие, вы можете использовать paste или paste0 для построения запроса. Однако функция sprintf также может сделать трюк. Я думаю, что это немного легче читать, поскольку вы избегаете смешанных одиночных и двойных кавычек.

I.e. выполните следующие действия в функции:

query <- sprintf("SELECT lbl, Date, dot 
       FROM 
       tblData t 
       WHERE t.lbl= '%s' 
       AND t.Date < '%s' 
       ORDER BY t.Date desc", x, y) 
sqlQuery(con, query) 
+0

Я согласен с синтаксисом, который немного легче для чтения. Однако объект 'lbl' не найден.ps: в моей таблице 'lbl' устанавливается как' nvarchar' – owner

+0

Переменная 'query' - это просто символьная строка в R, которая содержит SQL-запрос. Таким образом, вы должны изменить 'lbl' (который является« жестко закодированным »в строке») - это то, что ему нужно. Если он не найден, ваш построенный запрос неверен. К сожалению, я не знаком с SQL, поэтому Я не могу вам помочь. –

+0

Вы уже много сделали, и я благодарю вас за то время, которое вы посвятили моему протектору. Я проверил свой запрос, прежде чем задавать какие-либо вопросы на этом сайте ('= строгий минимум «Я мог бы сделать, и с ним ничего не случилось». Однако нежелательные «опечатки» с моей стороны при тестировании (копировании и вставке) вашего блока кодов создали такое «недоразумение». Извиняюсь за это и еще раз, спасибо. – owner

2

Вы должны построить запрос через paste или paste0. Попробуйте это:

dataframe <- sqlQuery(con, paste0(" 
       SELECT lbl,Date, dot 
       FROM 
       tblData t 
       WHERE t.lbl='",x,"' 
       AND t.Date <'",y,"' 
       ORDER BY t.Date desc")) 

Дело в том, что sqlQuery принимает два аргумента: строку connection и а. Строка - это команда sql, которую вы хотите выполнить. Если команда зависит от некоторых входов, вы должны соответственно построить строку. paste и sprintf позвольте вам сделать это. Вы помещаете значения переменных x и y в строку, представляющую команду. Это не sql-специфическое, а просто стандартное манипулирование строками.

+1

Также подумайте, хотите ли вы установить 'stringsAsFactors = FALSE'. Если ваша база данных хорошо управляется, она может и не понадобиться. – Benjamin

+0

@nicola: нет ошибки на бегущей стороне, поэтому спасибо. Однако, как ни удивительно, он не извлекает «dataframe». – owner

+0

@nicola: обновите мои предыдущие комментарии (пожалуйста, забудьте об этом ...). ваш синтаксис с 'paste0' работает до' AND t.Date <'", y,"' '. На самом деле это условие не заполнено и не иллюстрирует феномен: запрос все еще выводит весь набор данных до 'T', несмотря на то, что я указываю' y owner

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