質問

この質問にはすでに答えがあります:

値をのクエリに渡すことは可能ですか 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 の要素を参照するために使用する番号として dfout, 、または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())

それらの線に沿った何かが機能するはずです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top