有没有更好的方法在 R 中编码这个 sqlQuery?

Posted

技术标签:

【中文标题】有没有更好的方法在 R 中编码这个 sqlQuery?【英文标题】:Is there a better way to code this sqlQuery in R? 【发布时间】:2010-02-25 11:01:38 【问题描述】:

我正在编写一个 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)

但我不喜欢在每一行都加上引号,并让我的空格正确。有没有更好的办法?

【问题讨论】:

看看***.com/questions/1630724/… 这个问题和一个 Marek 链接也都暗示了新行字符的问题。我在下面的答案中使用了 gd047 之类的粘贴语法,并且对换行符没有任何问题。我在 SQL Server 和 Oracle 中都使用过这种语法。哪个数据库让您对换行语法感到不满? 我没有因为换行而出现任何错误,我只是对拥有它们有一种不好的感觉,但也许那是我错了......(如果重要的话,数据库是 oracle) 【参考方案1】:

我会使用这样的东西:

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="")
    )

【讨论】:

【参考方案2】:

用 gsub("\n", " ", "long multiline select string") 代替粘贴怎么样?

【讨论】:

【参考方案3】:

这是一个非常古老的问题,但认为这可能对某人有用。

我发现一个有用的东西是GetoptLong 包,它提供了 qq() 函数。我认为它受到 Perl 的启发,但本质上它提供了一种通过简单的变量插值来处理多行字符串的方法。例如:

library(GetoptLong)

tableName <- "myTable"
id <- 42

sqlQuery(odcon, qq("
    SELECT * FROM @tableName
    WHERE id = @id
    LIMIT 1
")

显然,我应该提一下通常的警告,如果您直接使用用户输入,这是一个坏主意,在这种情况下最好使用某种准备好的语句。

【讨论】:

以上是关于有没有更好的方法在 R 中编码这个 sqlQuery?的主要内容,如果未能解决你的问题,请参考以下文章

有没有更好的方法来编写这个 BigQuery Sql?

有没有更好的方法来进行这个查询?

有没有更好的方法在 R 中创建分位数“虚拟”/因子?

编写VHDL优先级编码器的捷径

有没有更好的方法在 python 中编写这个脚本

有没有办法比 DTX 更好地优化 Opus 中的静音期?