2

R ベクトルに ID のリストがあります。

IDlist <- c(23, 232, 434, 35445)

次のような句を含む RODBC sqlQuery を書きたいと思います

WHERE idname IN IDlist

テーブル全体を読み取ってから、R 内の idList ベクトルにマージする必要がありますか? または、これらの値を RODBC ステートメントに提供して、関心のあるレコードのみを復元するにはどうすればよいでしょうか?

注:リストは非常に長いため、以下の回答のように個々の値を SQL ステートメントに貼り付けてもうまくいきません。

4

2 に答える 2

8

を使用してステートメントをいつでも作成できますpaste

IDlist <- c(23, 232, 434, 35445)
paste("WHERE idname IN (", paste(IDlist, collapse = ", "), ")")
#[1] "WHERE idname IN ( 23, 232, 434, 35445 )"

明らかに、正確なステートメントを作成するには、これにさらに追加する必要があります

于 2012-10-09T01:31:31.900 に答える
0

ここここのヒントを組み合わせてバッチで実行することにより、同様の問題の解決策をまとめました。おおよそのコードは次のとおりです (分離されたマシンから再入力)。

#assuming you have a list of IDs you want to match in vIDs and an RODBC connection in mycon

#queries that don't change
q_create_tmp <- "create table #tmptbl (ID int)"
q_get_records <- "select * from mastertbl as X join #tmptbl as Y on (X.ID = Y.ID)"
q_del_tmp <- "drop table #tmptbl"

#initialize counters and storage
start_row <- 1
batch_size <- 1000
allresults <- data.frame()

while(start_row <= length(vIDs) {
    end_row <- min(length(vIDs), start_row+batch_size-1)
    q_fill_tmp <- sprintf("insert into #tmptbl (ID) values %s", paste(sprintf("(%d)", vIDs[start_row:end_row]), collapse=","))

    q_all <- list(q_create_tmp, q_fill_tmp, q_get_records, q_del_tmp)
    sqlOutput <- lapply(q_all, function(x) sqlQuery(mycon, x))

    allresults <- rbind(allresults, sqlOutput[[3]])
    start_row <- end_row + 1
}
于 2016-07-01T17:20:43.343 に答える