Frage

Ich arbeite in einem R-Skript, das ein langes SQL-Zeichenfolge verwendet, und ich würde die Abfrage relativ frei von anderem Markup halten mag, um das Kopieren und Einfügen zwischen Editoren und Anwendungen zu ermöglichen. Ich möchte auch die Möglichkeit, die Abfrage über mehrere Zeilen für eine bessere Lesbarkeit zu spalten.

In der RODBC Dokumentation wird die paste Funktion verwendet, um die Abfrage aus einzelnen Stücken zu bauen, aber ich würde etwas weniger kludgy und mit weniger Zitaten und Komma bevorzugen. Vielen Dank für Ihre Hilfe.

War es hilfreich?

Lösung

können Sie die% +% Operator überschreiben, um eine bessere String-Verkettung Syntax:

'%+%' <- function(x,y) paste(x,y,sep="")

y<-"y1"
x<-"somethingorother"
query<-
'SELECT DISTINCT x AS ' %+% x %+%',\n'    %+%
'                y AS ' %+% y %+% '\n'    %+%
' FROM tbl
 WHERE id=%s
 AND num=%d'

cat(query,"\n")

ergibt:

> cat(query,"\n")
SELECT DISTINCT x AS somethingorother,
                y AS y1
 FROM tbl
 WHERE id=%s
 AND num=%d 

Andere Tipps

Wenn Sie ein alten C-Programmierer aus Weg zurück sind, wie ich bin, könnten Sie genießen gerade sprintf () verwenden.

Leihen Ians Beispiel:

y<-"y1"
x<-"somethingorother"
query <- sprintf(
'SELECT DISTINCT x AS %s,
                 y AS %s,
 FROM tbl
 WHERE id=%%s
 AND num=%%d', x, y)

ergibt:

> cat(query,"\n")
SELECT DISTINCT x AS somethingorother,
                 y AS y1,
 FROM tbl
 WHERE id=%s
 AND num=%d 

Eine anmutige Art und Weise von „mit“ einer langen SQL-Abfrage ist es in einer separaten Datei .sql zu halten. Vorzugsweise irgendwo kann es in RStudio Syntax-Hervorhebungen, eine Textdatei, wird die Arbeit erledigen. Anschließend können Sie in Ihrem Haupt-R-Skript lesen Sie die Datei in einen String und füllen Sie es mit Variablen eine der vielen „Namen“ sprintf-Typ-Lösungen, wie Brüheinheit .

.sql

select *
from mytable
where id = {{a}} 
and somevar = {{b}}

.R

library(readr)
library(infuser)

query <- read_file("query.sql") %>%
         infuse(a = 1, b = 2) 

würde ich empfehlen, nur einen einfachen String verwenden und Variablenwerte in nicht einbetten. Verwenden Sie Platzhalter statt.

sql <- "SELECT foo FROM bar
    WHERE col1 = ?
    AND col2 = ?
    ORDER BY yomama"

Ich bin mir nicht sicher, ob das doppelte Anführungszeichen der beste Weg ist mehrzeiligen Strings in R-Code zum Einbetten (gibt es so etwas wie hier-docs?), Aber es funktioniert, anders als in Java.

Gibt es einen Grund, warum Sie nicht wollen, "\n" oder "\t" in Ihre Datenbank senden? Sie sollten in der SQL in Ordnung sein.

Ich habe einfach am Ende die SQL-Zeichenfolge mit sql <- gsub("\n","",sql) und sql <- gsub("\t","",sql) schlagen, bevor es ausgeführt wird. Der String selbst kann so lange sein, wie es sein muss, bleibt aber frei von jeder Verkettung Markup.

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