使用R包RJDBC重命名MySQL select语句中的列

时间:2011-10-09 13:40:53

标签: mysql r jdbc

我正在使用RJDBC软件包连接到Windows 7机器上的R中的MySQL(Maria DB)数据库,我正在尝试像

这样的语句
select a as b
from table

但该列将始终在数据框中继续命名为“a”。

这适用于RODBC和RMySQL,但不适用于RJDBC。不幸的是,我必须使用RJDBC,因为这是唯一一个对中文,希伯来语等字母编码没有问题的软件包(集合名称等等似乎不适用于RODBC和RMySQL)。

有没有人遇到过这个问题?

4 个答案:

答案 0 :(得分:9)

我遇到了同样令人沮丧的问题。有时,AS关键字会产生预期的效果,但有时则不会。我无法确定使其正常工作的条件。

简答:(感谢Simon Urbanek(RJDBC的软件包维护人员),Yev和Sebastien!请参阅长答案。)您可以尝试的一件事是在连接字符串中使用?useOldAliasMetadataBehavior=true打开JDBC连接。例如:

drv <- JDBC("com.mysql.jdbc.Driver", "C:/JDBC/mysql-connector-java-5.1.18-bin.jar", identifier.quote="`")
conn <- dbConnect(drv, "jdbc:mysql://server/schema?useOldAliasMetadataBehavior=true", "username", "password")
query <- "SELECT `a` AS `b` FROM table"
result <- dbGetQuery(conn, query)
dbDisconnect(conn)

这最终为我工作!在长答案

中查看更多详情,包括警告

长答案:我尝试了各种各样的东西,包括制作视图,更改查询,使用JOIN语句,不使用JOIN语句,使用ORDER BY和GROUP BY语句等。我从来没能弄清楚为什么我的一些查询能够重命名列而其他查询不能。

我联系了包维护者(Simon Urbanek。)以下是他所说的:

  

在绝大多数情况下,这是JBDC驱动程序中的问题,因为除了调用驱动程序之外,RJDBC实际上没有什么可做的。

然后他建议我确保我有最新的MySQL JDBC驱动程序。我确实有最新的版本。然而,它让我想到“也许它是JDBC驱动程序的错误。”所以,我搜索了Google:mysql jdbc driver bug alias

此查询的最高结果是an entry at bugs.mysql.com。 Yev,使用MySQL 5.1.22,说当他从驱动程序版本5.0.4升级到5.1.5时,他的列别名停止工作。被问到这是不是一个错误。

塞巴斯蒂安回答说:“不,这不是一个错误!这是所有后续版本驱动程序中记录的行为变化。”并建议使用?useOldAliasMetadataBehavior=true,引用documentation for the JDBC driver

警告Lector: JDBC驱动程序的文档说明了

  

useColumnNamesInFindColumn优先于useOldAliasMetadataBehavior,除非您需要它提供的与ResultSetMetadata相关的特定行为。

我没有时间充分研究这意味着什么。换句话说,我不知道使用useOldAliasMetadataBehavior=true的所有后果是什么。使用风险由您自己承担。别人有更多信息吗?

答案 1 :(得分:0)

我不知道RJDBC,但在某些情况下,如果需要为列提供永久别名而不重命名,可以使用VIEW

CREATE OR REPLACE VIEW v_table AS
SELECT a AS b
FROM table

......然后......

SELECT b FROM v_table

答案 2 :(得分:0)

ResultSetMetaData界面中有一个单独的函数用于检索列标签与列名称

String getColumnLabel(int column) throws SQLException;
  

获取指定列的建议标题,以便在打印输出中使用   显示器。建议的标题通常由SQL AS指定   条款。如果未指定SQL AS,则返回值   从getColumnLabel开始将与返回的值相同   getColumnName方法。

使用getColumnLabel应解决此问题(如果没有,请检查您的JDBC驱动程序是否遵循此规范)。

e.g。

ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
while(rs.next()) {
    for (int i = 1; i < columnCount + 1; i++) {
        String label = rsmd.getColumnLabel(i);
        System.out.println(rs.getString(label));
    }   
}

答案 3 :(得分:0)

这是我们通过RJDBC用于R和SAP HANA的工作:

names(result)[1]<-"b"

这不是最好的工作,但由于Aaron的解决方案对我们有用,我们采用了这种“解决方案”。