Frage

    

Diese Frage bereits eine Antwort hier:

    
            
  •              Dynamic „string“ in R                                      2 Antworten                          
  •     
    

Ist es möglich, einen Wert in die Abfrage in dbGetQuery vom RMySQL Paket zu übergeben.

Zum Beispiel, wenn ich eine Reihe von Werten in einem Zeichenvektor:

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

Und ich mag eine Schleife durch die Werte für die jeweils einen bestimmten Wert aus einer Datenbank herausziehen.

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

Wenn ich versuche, den Verweis auf den Wert hinzuzufügen, erhalte ich einen Fehler. Frage mich, ob es möglich ist, einen Wert aus einem R-Objekt in der Abfrage hinzuzufügen.

War es hilfreich?

Lösung

Eine Option ist die SQL-Zeichenfolge innerhalb der Schleife zu manipulieren. Im Moment haben Sie eine Stringliteral, die 'df[2]' nicht durch R als etwas anderes als Zeichen interpretiert wird. Es geht einige Unklarheiten in meiner Antwort zu sein, weil df in Ihrem Q ist offensichtlich kein Datenrahmen (es ist ein Zeichen Vektor!). So etwas wie dies tun, was Sie wollen.

Speichern Sie die Ausgabe in einem numerischen Vektor:

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

Jetzt können wir eine Schleife über die Elemente der df Ihre Abfrage dreimal auszuführen. Wir können die Schleife bis zwei Arten festgelegt: i) mit i als eine Zahl, die wir die Elemente von df und out, oder ii) mit i als jedes Element df wiederum verwenden zu referenzieren (dh a, dann b, ... ). Ich werde zeigen beide Versionen unten.

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

oder:

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

Welche Sie vom persönlichen Geschmack abhängen verwenden. Die zweite (ii) Version erfordert, dass Sie Satznamen auf dem Ausgangsvektor out, die die gleiche wie die Daten innerhalb out sind.

Nachdem alles gesagt, dass, vorausgesetzt, Ihre tatsächliche SQL-Abfrage an den ähnlich wie Sie schreiben, können Sie nicht tun dies in einer einzigen SQL-Anweisung, die GROUP BY-Klausel, um die Daten-Gruppe vor max(ID) Berechnung? Doing einfache Dinge, die in der Datenbank wie diese wird wahrscheinlich viel schneller sein. Leider habe ich nicht eine MySQL-Instanz haben, um mit und meine SQL-fu ist derzeit schwach zu spielen, so dass ich nicht ein Beispiel dafür gegeben werden.

Andere Tipps

Sie können auch den sprintf Befehl verwenden könnte, das Problem zu lösen (es ist, was ich verwenden beim Bau Shiny Apps).

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

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

etwas in diese Richtung sollte funktionieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top