Есть ли лучший способ закодировать этот sqlQuery в R?
-
22-09-2019 - |
Вопрос
Я пишу сценарий R, чтобы получить некоторые данные из базы данных, а затем что-то с ними сделать, используя пакет RODBC.В настоящее время все мои команды sqlQuery представляют собой одну длинную строку;
stsample<-sqlQuery(odcon, paste"select * from bob.DESIGNSAMPLE T1, bob.DESIGNSUBJECTGROUP T2, bob.DESIGNEVENT T3, bob.CONFIGSAMPLETYPES T4 WHERE T1.SUBJECTGROUPID = T2.SUBJECTGROUPID AND T1.TREATMENTEVENTID = T3.TREATMENTEVENTID AND T1.SAMPLETYPEKEY = T4.SAMPLETYPEKEY AND T1.STUDYID = T2.STUDYID AND T1.STUDYID = T3.STUDYID AND T1.STUDYID = ", chstudid, sep=""))
head(stsample)
который выглядит некрасиво и его трудно читать/обновлять.Я пробовал помещать их в несколько строк, но тогда мешались символы новой строки, в настоящее время мне лучше всего использовать много вставок;
stsample<-sqlQuery(odcon,
paste(
"select ",
"* ",
"from ",
"BOB.DESIGNSAMPLE T1, ",
"BOB.DESIGNSUBJECTGROUP T2, ",
"BOB.DESIGNEVENT T3, ",
"BOB.CONFIGSAMPLETYPES T4 ",
"WHERE ",
"T1.SUBJECTGROUPID = T2.SUBJECTGROUPID ",
"AND T1.TREATMENTEVENTID = T3.TREATMENTEVENTID ",
"AND T1.SAMPLETYPEKEY = T4.SAMPLETYPEKEY ",
"AND T1.STUDYID = T2.STUDYID ",
"AND T1.STUDYID = T3.STUDYID ",
"AND T1.STUDYID = ",chstudid,
sep="")
)
head(stsample)
Но мне не нравится заключать каждую строку в кавычки и правильно писать пробелы.Есть ли способ лучше ?
Решение
Я бы использовал что-то вроде этого:
stsample<-sqlQuery(odcon,
paste("
####DATASET CONSTRUCTION QUERY #########
select
*
from
BOB.DESIGNSAMPLE T1,
BOB.DESIGNSUBJECTGROUP T2,
BOB.DESIGNEVENT T3,
BOB.CONFIGSAMPLETYPES T4
WHERE
T1.SUBJECTGROUPID = T2.SUBJECTGROUPID
AND T1.TREATMENTEVENTID = T3.TREATMENTEVENTID
AND T1.SAMPLETYPEKEY = T4.SAMPLETYPEKEY
AND T1.STUDYID = T2.STUDYID
AND T1.STUDYID = T3.STUDYID
AND T1.STUDYID =
###################################
", as.character(chstudid), sep="")
)
Другие советы
А как насчет использования gsub(" ", " ", "длинная многострочная строка выбора") вместо вставки?
Это действительно старый вопрос, но думаю, что это может быть кому-то полезно.
Одна вещь, которую я нашел полезной, это GetoptLong пакет, который предоставляет функцию qq().Я думаю, что он вдохновлен Perl, но по сути он обеспечивает способ создания многострочной строки с простой интерполяцией переменных.Например:
library(GetoptLong)
tableName <- "myTable"
id <- 42
sqlQuery(odcon, qq("
SELECT * FROM @{tableName}
WHERE id = @{id}
LIMIT 1
")
Очевидно, я должен упомянуть обычное предостережение о том, что это плохая идея, если вы работаете напрямую с пользовательским вводом, и в этом случае было бы лучше использовать какой-то подготовленный оператор.