5

dbGetQueryRMySQL パッケージからクエリに値を渡すことは可能ですか。

たとえば、文字ベクトルに一連の値があるとします。

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

そして、値をループして、それぞれのデータベースから特定の値を引き出したいと思います。

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

値への参照を追加しようとすると、エラーが発生します。クエリで R オブジェクトから値を追加できるかどうか疑問に思っています。

4

2 に答える 2

4

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

出力を数値ベクトルに格納します。

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

これで、 の要素をループしてdf、クエリを 3 回実行できます。ループを 2 つの方法で設定できます。i) とのi要素を参照するために使用する番号として、または ii)の各要素として順番に (つまり、その後、...)。以下に両方のバージョンを示します。dfoutidfab

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

また:

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

どちらを使用するかは、個人の好みによって異なります。out2 番目の (ii) バージョンでは、 内のデータと同じ名前を出力ベクトルに設定する必要がありますout

GROUP BYとはいえ、実際の SQL クエリが投稿したものと似ていると仮定すると、句を使用して単一の SQL ステートメントでこれを実行して、計算する前にデータをグループ化することはできませんmax(ID)か? このようにデータベースで単純なことを行うと、おそらくはるかに高速になります。残念ながら、MySQL のインスタンスが手元になく、現在 SQL-fu が弱いため、この例を示すことはできません。

于 2010-11-27T08:59:51.743 に答える