読者です 読者をやめる 読者になる 読者になる

PostgreSQLのResultSetMetaData#getColumnName

Java

地味な話ですが。
PostgreSQLJDBCは、ResultSetMetaData#getColumnNameの挙動が他のDBのJDBCと違う。
selectするときにカラム名に別名をつけた場合、getColumnNameは元のカラム名、getColumnLabelは別名をとってくるんですが、PostgreSQLは、どっちも別名を返します。
以下、PostgreSQL, H2, hsqldbで試したコード。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;

public class Main {

    private static final String SQL = "select column as alias from table";

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {

        Class.forName("org.postgresql.Driver");
        Connection conn = DriverManager.getConnection("jdbc:postgresql://省略", "user", "pass");
        printMeta("postgresql: ", conn);
        conn.close();

        Class.forName("org.h2.Driver");
        conn = DriverManager.getConnection("jdbc:h2:tcp://localhost/省略", "user", "pass");
        printMeta("h2: ", conn);
        conn.close();

        Class.forName("org.hsqldb.jdbcDriver");
        conn = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/省略", "user", "pass");
        printMeta("hsqldb: ", conn);
        conn.close();
    }

    private static void printMeta(String dbms, Connection conn)
            throws SQLException {
        ResultSetMetaData meta = conn.createStatement().executeQuery(SQL).getMetaData();
        System.out.println(dbms);
        System.out.println("  columnName: " + meta.getColumnName(1));
        System.out.println("  columnLabel: " + meta.getColumnLabel(1));
    }
}

出力

postgresql: 
  columnName: alias
  columnLabel: alias
h2: 
  columnName: COLUMN
  columnLabel: ALIAS
hsqldb: 
  columnName: COLUMN
  columnLabel: ALIAS

Oracle, MySQLもh2やhsqdbと同じだったはず。
別なこと調査してたら、なぜかここに辿り着いた。。

以上