我在SQL表中有一个列,其中包含在MSSQL中存储为nvarchar(255)的15位数ID(例如'30000005000008498')。
如果我使用robdc库对此运行sql查询,则数据会被隐含地转换为数字。
library("RODBC")
odbcChannel <- odbcConnect("TableName")
ID <- sqlQuery(odbcChannel, "SELECT DISTINCT [ID] FROM TEST4")
我已通过
验证了这一点str(ID)
我接下来尝试的是使用
将数据转换为角色ID <- as.character(ID)
无需收到错误消息即可使用。不幸的是,部分数据被改变了,这对于唯一的ID是坏的:
最低范例:
a = 30000005000008498
b <- as.character(a)
输出是:
[1] "30000005000008496"
我认为它可能与数字的最大大小有关。对于较小的数字,as.character工作正常。但是,从SQL导入时,我无法弄清楚如何保留初始ID。
问题1:是否有可能避免对num?
进行隐式打字问题2:如何在不更改R的情况下从SQL导入15位字符串的任何想法?
答案 0 :(得分:5)
使用as.is = TRUE。
testid <- sqlQuery(database,"SELECT CAST(id as CHAR) as id from my_table", as.is=TRUE);
即使数据库中的列id是数字,testid也将是包含字符输入的数据框。 我认为as.is可以分别为每一列设置(使用as.is = c(..))或同时为所有列设置。
当列已经是VARCHAR类型时,可能不需要CAST(.. as CHAR)。