Добавьте динамическое значение в RMYSQL GetQuery [дублировать

StackOverflow https://stackoverflow.com/questions/4290672

  •  28-09-2019
  •  | 
  •  

Вопрос

Этот вопрос уже имеет ответ здесь:

Можно ли пройти значение в запрос в dbGetQuery из пакета Rmysql.

Например, если у меня есть набор значений в векторном вектор:

df <- c('a','b','c')

И я хочу зацикливаться через значения, чтобы вытащить определенное значение из базы данных для каждого.

library(RMySQL)    
res <- dbGetQuery(con, "SELECT max(ID) FROM table WHERE columna='df[2]'")

Когда я пытаюсь добавить ссылку на значение, я получаю ошибку. Удивительно, что можно добавить значение из объекта R в запросе.

Это было полезно?

Решение

Один вариант - манипулировать строкой SQL в цикле. На данный момент у вас есть строковая буквальная, 'df[2]' не интерпретируется r как все, кроме персонажей. В моем ответе будет некоторые неоднозначные возможности, потому что df В вашем Q - это нечестно не кадр данных (это символ вектор!). Что-то вроде этого сделает то, что вы хотите.

Храните вывод в числовом векторе:

require(RMySQL)
df <- c('a','b','c')
out <- numeric(length(df))
names(out) <- df

Теперь мы можем закрутить элементы df Для выполнения вашего запроса три раза. Мы можем установить цикл два способа: I) с i как число, которое мы используем для ссылки на элементы df и out, или II) с i как каждый элемент df в свою очередь (т.е. a, потом b, ...). Я покажу обе версии ниже.

## Version i
for(i in seq_along(df)) {
    SQL <- paste("SELECT max(ID) FROM table WHERE columna='", df[i], "';", sep = "")
    out[i] <- dbGetQuery(con, SQL)
    dbDisconnect(con)
}

ИЛИ:

## Version ii
for(i in df) {
    SQL <- paste("SELECT max(ID) FROM table WHERE columna='", i, "';", sep = "")
    out[i] <- dbGetQuery(con, SQL)
    dbDisconnect(con)
}

Который вы используете, будут зависеть от личного вкуса. Вторая (ii) версия требует, чтобы вы установили имена на выходе вектор out которые такие же, как данные внутри out.

Сказав все это, предполагая, что ваш фактический запрос SQL аналогичен тому, которое вы публикуете, не можете сделать это в одном операторе SQL, используя GROUP BY пункт, чтобы сгруппировать данные перед вычислением max(ID)? Делать простые вещи в базе данных, как такова, скорее всего, будет намного быстрее. К сожалению, у меня нет экземпляра MySQL, чтобы играть, и мой SQL-FU слабым в настоящее время, поэтому я не могу привести пример этого.

Другие советы

Вы также можете использовать sprintf Команда для решения проблемы (это то, что я использую при создании блестящих приложений).

df <- c('a','b','c')

res <- dbGetQuery(con, sprintf("SELECT max(ID) FROM table WHERE columna='%s'"),df())

Что-то вдоль этих строк должно работать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top