2009-10-27 8 views
6

Pracuję w skrypcie R, który używa długiego ciągu SQL i chciałbym, aby zapytanie było względnie wolne od innych znaczników, aby umożliwić kopiowanie i wklejanie między edytorami i aplikacjami. Chciałbym również możliwość podzielenia zapytania między liniami w celu zwiększenia czytelności.Czy mogę z wdzięcznością dołączyć sformatowane ciągi SQL w skrypcie R?

W dokumentacji RODBC funkcja paste służy do budowania zapytania z oddzielnych fragmentów, ale wolę coś mniej kludgy oraz mniej cytatów i przecinków. Dzięki za pomoc.

Odpowiedz

7

można zastąpić operatora% +% mieć lepszy ciąg concatination składnię:

'%+%' <- 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") 

Wynik:

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

Lubię nadpisanie. Dzięki. –

+0

Uważam, że shQuote jest pomocny, gdy x lub y są ciągami. –

11

Jeśli jesteś starą programista C z drodze powrotnej, jak ja , możesz cieszyć się właśnie za pomocą sprintf().

Wypożyczenie przykład Iana:

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

plony:

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

Lubię również używać sprintf do interpolacji w ciągu wieloliniowym. Przypomina to nieco sposób wiązania zmiennych z instrukcjami w DBI Perla. I czytelny. – medriscoll

1

ja skończyło się po prostu uderzając w sql ciąg z sql <- gsub("\n","",sql) i sql <- gsub("\t","",sql) przed uruchomieniem. Łańcuch może być tak długi, jak powinien, ale nie zawiera żadnych znaczników konkatenacji.

3

Zalecam używanie zwykłego łańcucha, a nie osadzanie w nim wartości zmiennych. Zamiast tego użyj zastępczych symboli.

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

Nie jestem pewien, czy cudzysłów jest najlepszym sposobem, aby osadzić ciągi kilka linii w kodzie R (jest tam coś takiego jak tutaj-docs?), Ale to nie działa, w przeciwieństwie do Javy.

Czy jest jakiś powód, dla którego nie chcesz wysłać "\n" lub "\t" do swojej bazy danych? Powinny być w porządku w SQL.

+1

Jak powiązać wartości z tymi symbolami zastępczymi? Nie mogłem znaleźć niczego w dokumentacji RODBC. –

+0

Niektórzy kierowcy wydają się go wspierać, inni nie. Zobacz http://stackoverflow.com/questions/2186015/bind-variables-in-r-dbi. –

+0

Funkcja RODBC nie obsługuje zapytań sparametryzowanych. RODBCext dodaje to. Wygląda na to, że DBI właśnie je dodaje. – blongworth

5

Pełna wdzięku metoda: "W tym" długa kwerenda SQL polega na przechowywaniu jej w oddzielnym pliku .sql. Najlepiej gdzieś jest podświetlona składnia, plik tekstowy w RStudio wykona zadanie. Następnie możesz w głównym skrypcie R odczytać plik z ciągu znaków i zapełnić go zmiennymi za pomocą jednego z wielu "nazwanych" sprintf -typowych rozwiązań, takich jak infuser.

.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) 
+0

Przygotowane oświadczenie jest bezpieczniejszym sposobem na zrobienie tego. –

+0

Przygotowane oświadczenie jest również znacznie bardziej wydajne w wielu przypadkach. Jeśli twoja baza danych ma optymalizator buforowania, może użyć tego samego planu wykonania dla tej samej instrukcji z różnymi powiązanymi parametrami, ale jeśli zastąpisz parametry bezpośrednio w SQL, prawdopodobnie za każdym razem będzie musiał przeliczyć plan. –

Powiązane problemy