为什么WHERE语句在RODBC中的sqlQuery中不起作用?

时间:2010-09-01 20:48:36

标签: r rodbc sybase-asa

我们将所有实验室数据保存在Sybase数据库中。当我想进行数据处理和分析时,我用RODBC将数据读入R中。

library(RODBC)
channellab <- odbcConnect("Labdata")
indivs <-sqlQuery(channellab,'SELECT * from CGS.Specimen')

到目前为止一直很好,除了CGS.Specimen是我们整个实验室馆藏的表格。有近40000个标本(行)有66个变量。这需要花费不必要的时间来阅读,特别是当我只对一项有大约1000个标本的研究感兴趣时。解决这个问题的明显方法是

indivs <-sqlQuery(channellab,'SELECT * from CGS.Specimen WHERE StudyCode="RP"')  

但是当我跑步时,我得到了

  

[1]“42S22 -143 [Sybase] [ODBC驱动程序] [Adaptive Server Anywhere]未找到列:未找到列'RP'”“[RODBC]错误:无法从CGS.Specimen中获取SQLExecDirect'SELECT * WHERE StudyCode = \“RP \”'“

我玩了引号,我玩过逃生斜线,但唉,我已经无处可去了。

例如

indivs <-sqlQuery(channellab,'SELECT * from CGS.Specimen WHERE StudyCode= 'RP'  ')

错误:“indivs&lt; -sqlQuery(channellab,'SELECT * from CGS.Specimen WHERE StudyCode ='RP”

中的意外符号
indivs <-sqlQuery(channellab,"SELECT * from CGS.Specimen WHERE StudyCode= 'RP'  ")

.Call(C_RODBCFetchRows,attr(channel,“handle_ptr”),max,buffsize,出错:   不允许使用负长度载体

你有什么建议?

3 个答案:

答案 0 :(得分:4)

您报告的最后一个错误是从.Call函数到c函数RODBCFetchRows。因此,您的引号问题似乎已得到解决。但是,由于上述错误,您仍然有问题。可能行未正确报告(c函数尝试根据此值分配向量,但不检查负值)。尝试:

indivs <-sqlQuery(channellab,"SELECT * from CGS.Specimen WHERE StudyCode= 'RP'", believeNRows = FALSE)

答案 1 :(得分:2)

编辑:

indivs <-sqlQuery(channellab,'SELECT * from CGS.Specimen WHERE StudyCode=\'RP\'')  

好的,您可以运行另一个查询,其中返回一些数据?

例如

WHERE StudyCode=StudyCode?这是否会给出与-ve长度相同的错误?

这意味着上述内容对于转义StudyCode是正确的。 -Le长度是另一个错误。你能不能返回所有带有*但没有空值的特定列的列吗?

答案 2 :(得分:2)

尝试选项believeNRows = FALSE。这对我来说是一个类似的错误(负长度错误)。

这个问题更重要: Querying Oracle DB from Revolution R using RODBC