Seite 1 von 1
For schleife mit sql
Verfasst: Do Jul 27, 2017 11:54 am
von janedoe
hallo.
ich versuche jetzt schon seit einiger Zeit eine for-Schleife zu basteln, die leider so gar nicht funktioniert. Ich habe eine datenbank und möchte nur werte rauslesen, die ein bestimmtes kriterium erfüllen, in diesem Fall phi.
Code: Alles auswählen
for (phi in 45:60){
d <- dbGetQuery(con, 'SELECT datum, phi FROM data WHERE P = phi')}
Als Fehlermeldung bekomme ich, dass es phi nicht gibt.
Code: Alles auswählen
Fehler in rsqlite_send_query(conn@ptr, statement) : no such column: phi
Danke.
Jani
Re: For schleife mit sql
Verfasst: Do Jul 27, 2017 1:53 pm
von jogo
Hallo Jani,
janedoe hat geschrieben: Do Jul 27, 2017 11:54 amCode: Alles auswählen
for (phi in 45:60){
d <- dbGetQuery(con, 'SELECT datum, phi FROM data WHERE P = phi')}
Als Fehlermeldung bekomme ich, dass es phi nicht gibt.
Code: Alles auswählen
Fehler in rsqlite_send_query(conn@ptr, statement) : no such column: phi
das ist klar:
phi ist ein Objekt in der R-Umgebung. Deine Datenbank kennt es nicht. Wenn Du so etwas willst, dann muss es so sein:
Code: Alles auswählen
dbGetQuery(con, paste0('SELECT datum, P FROM data WHERE P = ', phi))
pder
Code: Alles auswählen
dbGetQuery(con, paste0('SELECT datum, P as phi FROM data WHERE P = ', phi))
oder
Code: Alles auswählen
dbGetQuery(con, paste0('SELECT datum, P phi FROM data WHERE P = ', phi))
(je nach SQL-Dialekt)
Anmerkung zum Algorithmus:
Du durchläufst die Schleife mit Werte 45, 46, ..., 60 für
phi
Bei jedem Mal wird
d überschrieben.
Nach Durchlaufen der Schleife ist in
d nur das letzte Ergebnis.

Das möchtest Du mit Sicherheit
nicht
Nun könnte man das mit
lapply() richtigstellen, aber in Deinem Fall solltest Du die SQL-Lösung verwenden:
... vielleicht kennt Deine Datenbank ein Konstrukt namens
BETWEEN ...
https://www.tutorialspoint.com/sqlite/s ... rators.htm
Gruß, Jörg
Re: For schleife mit sql
Verfasst: Do Jul 27, 2017 3:53 pm
von janedoe
Hallo Jörg,
vielen Dank für deine Antwort. Dann probiere ich das noch mit P < und >. Dazu hätte ich noch eine Frage: die Ps sind bei mir keine ganzen Zahlen , sie variieren zwischen 48,14 und 59,89, ist das für die Abfrage egal, oder muss ich zusätzlich etwas berücksichtigen? Die AND Bedingungen kann ich auch beliebig erweitern? Zb hätte ich noch eine weitere Bedingung, über die ich die Einschränkung machen kann, das wäre die Bedingung "Land" oder "Wasser". Dabei handelt es sich um CHR, muss ich diese Bedingung dann in Anführungszeichen setzten? (okay, vielleicht doch mehr als eine Frage

)
Code: Alles auswählen
d <-dbGetQuery(con, paste0('SELECT datum, P phi FROM data WHERE Tag IN ("20110127") AND surface = "Land" AND WHERE P > 48 AND P < 60'))
glg jani
Re: For schleife mit sql
Verfasst: Do Jul 27, 2017 4:20 pm
von jogo
janedoe hat geschrieben: Do Jul 27, 2017 3:53 pmDazu hätte ich noch eine Frage: die Ps sind bei mir keine ganzen Zahlen , sie variieren zwischen 48,14 und 59,89, ist das für die Abfrage egal, oder muss ich zusätzlich etwas berücksichtigen?
Dann hätte das mit Deiner for-Schleife ohnehin nicht funktioniert, da Du ja dort auf Gleichheit getestet hättest. Die Gleichheit wäre sehr selten gegeben, also z.B. dass der Wert in Spalte P exakt 47 ist.
Die AND Bedingungen kann ich auch beliebig erweitern? Zb hätte ich noch eine weitere Bedingung, über die ich die Einschränkung machen kann, das wäre die Bedingung "Land" oder "Wasser". Dabei handelt es sich um CHR, muss ich diese Bedingung dann in Anführungszeichen setzten? (okay, vielleicht doch mehr als eine Frage

)
ja, die WHERE-Klausel darf recht lang werden. ja, character-Spalten sind gegebenenfalls mit Zeichenkettenkonstanten zu vergleichen.
Wie Edi schon schrieb: Dies alles sind keine Fragen zu R sondern zu SQL.
viewtopic.php?f=7&t=496&p=1936#p1921
Bitte beschäftige Dich ein wenig mit der Datenbank, die Du verwendest.
Code: Alles auswählen
d <-dbGetQuery(con, paste0('SELECT datum, P phi FROM data WHERE Tag IN ("20110127") AND surface = "Land" AND WHERE P > 48 AND P < 60'))
wozu soll hier das
paste0(...) gut sein?
Gruß, Jörg