【问题标题】:RODBC Query TuningRODBC 查询调优
【发布时间】:2011-05-14 01:07:26
【问题描述】:

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

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

使用以下命令

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

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

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

但是当我希望它们被格式化为日期时,我“丢失”了列。

【问题讨论】:

  • “输”到底是什么意思?日期列是否转换为整数或 Oracle 默认日期(即“22-NOV-10”)?
  • 如果我使用第一个查询,日期字段在数据框中返回为 POSIXct。第二个查询是字符。显然不是世界末日,但我试图在 R 中尽量减少更正数据类型。

标签: r rodbc


【解决方案1】:

您也陷入了我一直在努力解决的问题中。我不能就什么是“正确”或“最好”发表意见,而只能评论我过去所做的事情。

我通常会按照您在第一个示例中所做的那样处理类型更改,一旦它们进入 R。如果您想执行后一种方法,您可以在 R 中转换日期。始终设置为以“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 骚扰我的数据类型的问题是服务器端的类型不明确。这通常是 SQL 端的 CASE 语句或类似语句的结果。

【讨论】:

  • 谢谢京东。我会试一试,但至少它确认我无论如何都需要做一些数据准备。
【解决方案2】:

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

因此,如果您的结果集由两个日期列和一个字符列组成,您可以这样做:

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

编辑:根据 Kalin 的建议,您还可以参考应该“原样”的列。例如

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

将保留第 2 列和第 4 列“原样”。

【讨论】:

  • 仅供参考,您也可以输入应该“原样”的列数(我认为其余的保持默认值)。例如... as.is = c( 2, 4 ) 将使第 2 列和第 4 列按“原样”解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-25
  • 1970-01-01
  • 1970-01-01
  • 2011-11-17
  • 2016-03-22
  • 1970-01-01
相关资源
最近更新 更多