2010-11-27 4 views
4

RMySQL 패키지의 dbGetQuery에있는 쿼리에 값을 전달할 수 있습니까? 예를 들어RMySQL getQuery에 동적 값 추가

, 나는 문자 벡터 값 세트가있는 경우 :

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

을 내가 각 데이터베이스에서 특정 값을 꺼내 값을 통해 루프합니다.

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

값에 대한 참조를 추가하려고하면 오류가 발생합니다. 쿼리에서 R 개체의 값을 추가 할 수 있는지 궁금합니다.

+1

[WHERE 필드에 사용자 지정 변수가있는 RSQLite 쿼리]가 중복 됨 (http://stackoverflow.com/q/3449666/271616) –

+0

Joshua, 그것을 지적 해 주셔서 감사합니다. 그것은 훌륭한 대답이기도합니다. 나는 RMySQL 솔루션을 찾고있었습니다. – analyticsPierce

+0

RMySQL을 사용하든 RSQLlite를 사용하든 솔루션이 동일합니다. –

답변

4

하나의 옵션은 루프 내에서 SQL 문자열을 조작하는 것입니다. 문자열 리터럴이있는 순간에 'df[2]'은 R 이외의 문자로 해석되지 않습니다. Q에서 df은 분명히 데이터 프레임이 아니기 때문에 (캐릭터 벡터입니다!) 내 대답에는 모호한 점이있을 것입니다. 이 같은 것이 당신이 원하는 것을 할 것입니다.

스토어 숫자 벡터 출력 :

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

이제 우리는 df의 요소를 루프 쿼리 세 번을 실행 할 수 있습니다. 루프를 두 가지 방법으로 설정할 수 있습니다. i) dfout의 요소를 참조하는 데 사용하는 숫자로 i을 사용하거나, df의 각 요소로 i을 차례로 사용하는 번호 (예 : a, b, ...)로 설정할 수 있습니다.). 아래 두 가지 버전을 모두 보여 드리겠습니다.

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

OR : 당신은 개인적인 취향에 따라 달라집니다 사용

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

. 두 번째 (ii) 버전에서는 out 내의 데이터와 동일한 출력 벡터 out의 이름을 설정해야합니다.

실제 SQL 쿼리가 게시 된 것과 유사하다고 가정하면 GROUP BY 절을 사용하여 단일 SQL 문에서 max(ID)을 계산하기 전에 데이터를 그룹화 할 수 없습니까? 이와 같이 데이터베이스에서 간단한 일을하는 것이 훨씬 더 빠를 것입니다. 불행히도, 나는 플레이 할 SQL 인스턴스가 없으며 현재 SQL-fu는 약한 편이므로이 예제를 제공 할 수는 없습니다.

+1

@Gavin, 내 머리 꼭대기에서 나는 마지막 단락에서 언급 한 쿼리가 다음과 같을 것이라고 생각한다. 'SELECT max (ID), columna FROM table where'('a', 'b', 'c') GROUP BY columna' –

+2

변수에서 SQL 문법을 깨뜨릴 수있는 일이 없도록하십시오. 필수 XKCD 참조 : http://xkcd.com/327/ – Spacedman

+0

@ 스페이스 맨, 리틀 바비 테이블 ... 클래식! –

3

sprintf 명령을 사용하여 문제를 해결할 수도 있습니다.이 문제는 Shiny Apps를 제작할 때 사용합니다. 그 라인을 따라

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

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

뭔가 작동합니다.