2010-11-27 13 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

ジョシュア、それを指摘してくれてありがとう。それはまた素晴らしい答えです。私はRMySQLソリューションを探していました。 – analyticsPierce

+0

RMySQLを使用しているかRSQLliteを使用しているかにかかわらず、ソリューションは同じです。(「A」、「B」、「C」)のテーブルからcolumna columna、 'MAX(ID)を選択します: –

答えて

4

1つのオプションは、ループ内のSQL文字列を操作することです。文字列リテラルがある瞬間、'df[2]'はR以外の文字として解釈されません。あなたのQのdfは明らかにデータフレームではないので(文字ベクトルです!)、私の答えにはあいまいさがあります。このような何かがあなたが望むことをするでしょう。

ストア数値ベクトルで出力:

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

は、今、私たちはdfの要素をループは、クエリを3回実行することができます。ループを2つの方法で設定できます。i)dfoutの要素を参照するために使用する番号としてi、またはii)dfの各要素としてiを順番に使用する番号(つまり、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) 
} 

。 2番目のバージョンでは、outのデータと同じ名前の出力ベクトルoutを設定する必要があります。

実際のSQLクエリが投稿したものと似ているとすれば、GROUP BY句を使用して単一のSQL文でこれを実行して、計算する前にデータをグループ化することはできませんか?max(ID)?このようなデータベースで単純なことを行うことは、はるかに迅速になるでしょう。残念ながら、私は遊ぶためにMySQLインスタンスを持っておらず、私のSQL-fuは現在弱いですから、この例を挙げることはできません。

+1

@Gavinは、私の頭の上から、私はあなたの最後の段落で言及したクエリがあることだと思いますGROUP BY columna' –

+2

あなたの変数にSQL構文を壊すことのないものがないことを忘れないでください。義務的なXKCDリファレンス:http://xkcd.com/327/ – Spacedman

+0

@Spacedman、Little Bobby Tables ... classic! –

3

また、sprintfコマンドを使用して問題を解決することもできます(これはShiny Appsを構築するときに使用します)。これらの線に沿って

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

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

何かが動作するはずです。

関連する問題