フォーマットされたSQL文字列をRスクリプトに適切に含めることはできますか?
質問
長いSQL文字列を使用するRスクリプトで作業しています。エディターとアプリケーション間でコピーアンドペーストできるように、クエリに他のマークアップを比較的含まないようにします。読みやすくするために、クエリを行に分割する機能も必要です。
RODBCのドキュメントでは、paste
関数を使用してクエリを個別のチャンクから構築していますが、クラウディが少なく、引用符とカンマが少ないものが望ましいです。ご協力ありがとうございます。
解決
%+%演算子をオーバーライドして、文字列の連結構文を改善できます。
'%+%' <- function(x,y) paste(x,y,sep="")
y<-"y1"
x<-"somethingorother"
query<-
'SELECT DISTINCT x AS ' %+% x %+%',\n' %+%
' y AS ' %+% y %+% '\n' %+%
' FROM tbl
WHERE id=%s
AND num=%d'
cat(query,"\n")
利回り:
> cat(query,"\n")
SELECT DISTINCT x AS somethingorother,
y AS y1
FROM tbl
WHERE id=%s
AND num=%d
他のヒント
あなたが昔のCプログラマであるなら、私と同じように、あなたはただsprintf()を使うことを楽しむかもしれません。
Ianの借用例:
y<-"y1"
x<-"somethingorother"
query <- sprintf(
'SELECT DISTINCT x AS %s,
y AS %s,
FROM tbl
WHERE id=%%s
AND num=%%d', x, y)
利回り:
> cat(query,"\n")
SELECT DISTINCT x AS somethingorother,
y AS y1,
FROM tbl
WHERE id=%s
AND num=%d
<!> quot; <!> quot; を含む <!> quot;の優雅な方法は、別の.sql
ファイルに保持することです。できれば、構文を強調表示できる場所であれば、RStudioのテキストファイルで処理できます。次に、メインRスクリプトでファイルを文字列に読み取り、多数の<!> quot; named <!> quot;のいずれかを使用して変数を入力できます。 sprintf
タイプのソリューション( infuser など)。
.sql
select *
from mytable
where id = {{a}}
and somevar = {{b}}
.R
library(readr)
library(infuser)
query <- read_file("query.sql") %>%
infuse(a = 1, b = 2)
プレーンな文字列を使用することをお勧めします。変数値を埋め込みません。代わりにプレースホルダーを使用してください。
sql <- "SELECT foo FROM bar
WHERE col1 = ?
AND col2 = ?
ORDER BY yomama"
二重引用符がRコードに複数行の文字列を埋め込む最良の方法であるかどうかはわかりませんが(here-docsのようなものはありますか?)、Javaとは異なり、機能します。
データベースに"\n"
または"\t"
を送信したくない理由はありますか? SQLでは問題ありません。
SQL文字列を実行する前にsql <- gsub("\n","",sql)
とsql <- gsub("\t","",sql)
で単純にヒットしました。文字列自体は必要なだけ長くできますが、連結マークアップはありません。