【问题标题】:Why will WHERE statement not work in sqlQuery in RODBC?为什么 WHERE 语句在 RODBC 的 sqlQuery 中不起作用?
【发布时间】:2011-04-07 00:40:22
【问题描述】:

我们将所有实验室数据保存在 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 Driver][Adaptive Server Anywhere]Column not found: Column 'RP' not found" "[RODBC] ERROR: Could not SQLExecDirect 'SELECT * from CGS.Specimen WHERE StudyCode=\"RP\"'"

我玩过引号,也玩过转义斜线,但可惜我一无所获。

例如

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

错误:“indivs

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

.Call(C_RODBCFetchRows, attr(channel, "handle_ptr"), max, buffsize, 中的错误: 不允许使用负长度向量

你有什么建议?

【问题讨论】:

  • 问题是围绕在sql语句周围的单引号与变量值周围的引号混淆了吗?
  • 此错误是由于 RP 周围的双引号引起的。我很困惑您是否尝试过@Preet 答案中的单引号?
  • 是的。我已经尝试过 Preet 的建议。它们不起作用。

标签: r rodbc sybase-asa


【解决方案1】:

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

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

【讨论】:

  • 我试着运行你的线路。没有喜悦。 > indivs [1] "42000 -131 [Sybase][ODBC 驱动程序][Adaptive Server Anywhere]语法错误或访问冲突:在 ...StudyCode= 'RP'[,] 中的 ',' 附近 =..." [ 2]“[RODBC] 错误:无法 SQLExecDirect 'SELECT * from CGS.Specimen WHERE StudyCode='RP', believeNRows = FALSE'”> str(indivs) chr [1:2]“42000 -131 [Sybase][ODBC Driver][Adaptive Server Anywhere]语法错误或访问冲突:在 ...StudyCode= 'RP'[,] b"| 中的 ',' 附近截断 ...
  • 哎呀,有一个小错字...believeNRows = FALSE 不应该出现在查询字符串中。修好了。
  • 马扎尔托夫!有用。为什么你认为 ODBC 连接返回的行数搞砸了。我想只要我们让它发挥作用,这并不重要。
  • 一些 Sybase 驱动程序的手动讨论没有报告可信的行数(对于一些 Oracle 驱动程序和 Mac OS X 的 SQLight 相同)。我不知道驱动程序是否可以修复(即更新),但您可以通过调整 buffsize 来提高性能。
【解决方案2】:

已编辑:

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

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

WHERE StudyCode=StudyCode 例如?这是否会给出关于 -ve 长度的相同错误?

这意味着以上对于转义 StudyCode 是正确的。 -Ve 长度是另一个错误。您能否返回不是所有带有 * 的列,而是返回没有空值的特定列?

【讨论】:

  • 它没有用。我得到了错误:“indivs
  • 还是不行。 .Call(C_RODBCFetchRows, attr(channel, "handle_ptr"), max, buffsize, : 不允许负长度向量中的错误我不知道这意味着什么,但它不起作用。我们还能尝试什么。
  • 我尝试了 indivs
  • 我不知道我是否理解你的附加问题,“你能不能返回没有 * 没有空值的特定列?”您可能的意思是我运行了诸如 indivs
  • 一些实时 voip 或 im 可能是有序的。你用gmail还是skype?如果是这样,我对两者都很满意。
猜你喜欢
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
  • 2011-11-16
  • 1970-01-01
  • 2019-07-12
  • 2023-03-21
  • 2014-01-17
  • 1970-01-01
相关资源
最近更新 更多