Pregunta

    

Esta pregunta ya tiene una respuesta aquí:

    
            
  •              dinámico “cadena” en I                                      2 respuestas                          
  •     
    

¿Es posible pasar un valor en la consulta en dbGetQuery del paquete RMySQL.

Por ejemplo, si tengo un conjunto de valores en un vector de caracteres:

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

Y yo quiero colocar a través de los valores de sacar un valor específico de una base de datos para cada uno.

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

Cuando intento agregar la referencia al valor me da un error. Se pregunta si es posible añadir un valor de un objeto R en la consulta.

¿Fue útil?

Solución

Una de las opciones es manipular la cadena SQL dentro del bucle. En el momento en que tiene un literal de cadena, el 'df[2]' no es interpretado por R como caracteres que no sean nada. No van a haber algunas ambigüedades en mi respuesta, porque en su df Q no es evidentemente una trama de datos (que es un vector de caracteres!). Algo como esto va a hacer lo que quiere.

almacenar el resultado en un vector numérico:

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

Ahora podemos bucle sobre los elementos de df para ejecutar la consulta tres veces. Podemos establecer el bucle de dos maneras: i) con i como un número que se utiliza para hacer referencia a los elementos de df y out, o ii) con i como cada elemento de df a su vez (es decir a, entonces b, ... ). Voy a mostrar a continuación las dos versiones.

## 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)
}

O:

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

Lo que se utilice dependerá del gusto personal. La segunda (ii) la versión requiere que nombres de conjuntos en la out vector de salida que son los mismos que los datos dentro out.

Una vez dicho todo esto, suponiendo que su actual consulta SQL es similar al que se publique, no se puede hacer esto en una sola instrucción SQL, utilizando la cláusula GROUP BY, para agrupar los datos antes de calcular max(ID)? Hacer las cosas simples en la base de datos como esto será probablemente mucho más rápido. Por desgracia, no tengo una instancia de MySQL en torno a jugar y mi SQL-Fu es débil actualmente, así que no puedo dado un ejemplo de esto.

Otros consejos

También puede utilizar el comando sprintf para resolver el problema (que es lo que yo uso en la construcción de Brillante Aplicaciones).

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

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

Algo por el estilo debería funcionar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top