質問
この質問にはすでに答えがあります:
- rの動的な「文字列」 2つの回答
値をのクエリに渡すことは可能ですか dbGetQuery
RMYSQLパッケージから。
たとえば、文字ベクトルに一連の値がある場合:
df <- c('a','b','c')
そして、値をループして、それぞれのデータベースから特定の値を引き出したいと思います。
library(RMySQL)
res <- dbGetQuery(con, "SELECT max(ID) FROM table WHERE columna='df[2]'")
値への参照を追加しようとすると、エラーが発生します。クエリ内のRオブジェクトから値を追加できるかどうか疑問に思います。
解決
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
の要素を参照するために使用する番号として df
と out
, 、またはii)で i
の各要素として df
順番に(すなわち 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)
}
また:
## 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クエリが投稿したものと似ていると仮定すると、1つのSQLステートメントでこれを行うことはできません。 GROUP BY
節、コンピューティング前にデータをグループ化する max(ID)
?このようなデータベースで簡単なことをするのは、おそらくはるかに速いでしょう。残念ながら、私は遊ぶためにMySQLインスタンスを持っていません、そして私のSQL-FUは現在弱いので、私はこの例を与えられません。
他のヒント
使用することもできます sprintf
問題を解決するコマンド(光沢のあるアプリを構築するときに使用するものです)。
df <- c('a','b','c')
res <- dbGetQuery(con, sprintf("SELECT max(ID) FROM table WHERE columna='%s'"),df())
それらの線に沿った何かが機能するはずです。