【问题标题】:Renaming columns in a MySQL select statement with R package RJDBC使用 R 包 RJDBC 重命名 MySQL 选择语句中的列
【发布时间】:2011-12-03 23:18:18
【问题描述】:

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

select a as b
from table

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

这通常适用于 RODBC 和 RMySQL,但不适用于 RJDBC。不幸的是,我不得不使用 RJDBC,因为这是唯一一个对中文、希伯来语等字母编码没有问题的包(设置名称等似乎不适用于 RODBC 和 RMySQL)。

有人遇到过这个问题吗?

【问题讨论】:

  • 我刚刚测试过,可以确认问题。不幸的是,我没有解决方案。

标签: mysql r jdbc


【解决方案1】:

这是我们通过 RJDBC 用于 R 和 SAP HANA 的解决方法:

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

这不是最好的解决方法,但由于 Aaron 的解决方案确实对我们有用,所以我们采用了这个“解决方案”。

【讨论】:

    【解决方案2】:

    ResultSetMetaData 接口中有一个单独的函数用于检索列 label 与列 name

    String getColumnLabel(int column) throws SQLException;
    

    获取指定列的建议标题以用于打印输出和 显示。建议的标题通常由 SQL AS 指定 条款。如果未指定 SQL AS,则返回值 fromgetColumnLabel 将与返回的值相同 getColumnName 方法。

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

    例如

    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】:

      我遇到了同样令人沮丧的问题。有时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 时,他的列别名停止工作。询问这是否是一个错误。

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

      Caveat Lector: JDBC 驱动程序的文档指出

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

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

      【讨论】:

        【解决方案4】:

        我不知道 RJDBC,但是在某些情况下,当需要为列赋予永久别名而不重命名它们时,可以使用 VIEWs

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

        ……然后……

        SELECT b FROM v_table
        

        【讨论】:

        • 这是事实,但不仅仅是解决此处发布的问题。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-07-09
        • 2018-01-19
        • 2017-06-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多