RODBC查询调优

时间:2010-11-22 19:03:55

标签: r rodbc

我正在尝试使用RODBC将数据从Oracle数据集市提取到R中。我已经能够解决一些问题,但我有一个基本问题。

如何保留数据库中的格式?

使用以下命令

uapp <- sqlQuery(ch, SQL, stringsAsFactors=F)

我的数据按预期检索,但是当它们应该是字符时,某些字段在R中转换为数字和逻辑一次。如果我使用的话,我可以解决这个问题:

uapp <- sqlQuery(ch, SQL, stringsAsFactors=F, as.is=T)

但我“丢失”列格式化为我希望它们的日期。

2 个答案:

答案 0 :(得分:6)

你陷入了我一直在努力的差距。我不能讨论“正确”或“最佳”的内容,而只是我过去做过的事情。

我通常会在第一个示例中执行您所做的操作,只需在进入R后处理类型更改。如果您想要执行后一种方法,则可以将日期转换为R中的日期。我的Oracle系统似乎总是被设置为以“22-NOV-10”格式返回日期,这对于解析很烦人。因此,我将在查询中使用Oracle to_char()函数将我的日期格式化为R可以轻松识别的内容。

因此,例如,我可能在我的SELECT语句中有这个:

to_char(myDate, 'yyyy-mm-dd') as myDate

然后我将其拉入名为myData的数据框中并执行此操作:

myData$properDate <- strptime(myData$myDate, "%Y-%m-%d")

是否处理修复日期或处理修复其他字段实际上取决于您拥有多少日期字段以及第一种方法弄乱了多少非日期字段。但根据我的经验,我要么最终修复一个,要么另一个。

使用方法1时可能会考虑的事项:尝试在SQL中使用cast()以强制将字段强制转换为特定类型。我唯一一次遇到RODBC骚扰我的数据类型的问题是当服务器端的类型不明确时。这通常是CASE语句或SQL端的一些结果。

答案 1 :(得分:2)

as.is参数可以是布尔矢量。

因此,如果您的结果集包含两个日期列,后跟一个字符列,则可以执行以下操作:

uapp <- sqlQuery(ch, SQL, stringsAsFactors = FALSE, as.is = c(FALSE, FALSE, TRUE))