長い SQL 文字列を使用する R スクリプトで作業しています。エディターとアプリケーション間でコピーと貼り付けができるように、クエリを他のマークアップから比較的解放したいと考えています。また、読みやすくするために、クエリを複数の行に分割する機能も必要です。
RODBC のドキュメントでは、このpaste
関数を使用して個別のチャンクからクエリを作成していますが、私としては、煩わしくなく、引用符とコンマが少ないものを好みます。ご協力いただきありがとうございます。
私と同じように、昔からの C プログラマーなら、sprintf() を使うだけでも楽しめるかもしれません。
イアンの例を借りる:
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
%+% 演算子をオーバーライドして、文字列連結構文を改善できます。
'%+%' <- 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
長い SQL クエリを「含める」ための適切な方法は、それを別の.sql
ファイルに保持することです。できれば、構文を強調表示できる場所で、RStudio のテキスト ファイルが機能します。次に、メインの R スクリプトでファイルを文字列に読み取り、 infuserなどの多くの「名前付き」sprintf
タイプのソリューションの 1 つを使用して変数を設定できます。
.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)
する前に実行するだけで終わってしまいました。文字列自体は必要なだけ長くすることができますが、連結マークアップはありません。