HHeLiBeXの日記 正道編

日々の記憶の記録とメモ‥

列名を持たない列の列名(意味不明)

なんと言えばいいのか分からなかったので意味不明なタイトルになったが、要は次のようなクエリを実行したときの結果表の列名はどうなるのか、ということ。

SELECT COUNT(*)
  FROM hoge

ということで、一通り調べてみた。
次のテーブルを前提とする。

CREATE TABLE hoge(v INTEGER NOT NULL)

で、次のパターンを試してみた。

  • (01) COUNT(v), MAX(v), MIN(v), SUM(v), AVG(v)
  • (02) COUNT(v) AS Count, MAX(v) AS Max, MIN(v) AS Min, SUM(v) AS Sum, AVG(v) AS Avg,
  • (03) COUNT(v) AS "Count", MAX(v) AS "Max", MIN(v) AS "Min", SUM(v) AS "Sum", AVG(v) AS "Avg",
  • (04) COUNT(v) AS C_Count, MAX(v) AS C_Max, MIN(v) AS C_Min, SUM(v) AS C_Sum, AVG(v) AS C_Avg,
  • (05) v+v, v-v, v*v, v/v, v*v+v/v-v

最後のパターンはおまけ。これも確かに列名が明示されていないケース。

一応、念のため(謎)、DatabaseMetaDataのgetDatabaseProductName()とgetDatabaseProductVersion()で取得したものも書いておく。まぁ今回は同じDBMS複数のマイナーバージョンを試すメリットはないとは思うが‥

DBMS getDatabaseProductName()
getDatabaseProductVersion()
DB2 9.1 DB2/NT
SQL09012
DB2 9.5 DB2/NT
SQL09052
DB2 9.7 DB2/NT
SQL09072
Oracle 10g XE Oracle
Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production
PostgreSQL 8.3 PostgreSQL
8.3.7
PostgreSQL 8.4 PostgreSQL
8.4.2
MySQL 5.1 MySQL
5.1.32-community
Firebird 2.1 Firebird 2.1.WI-V2.1.0.17798 Firebird 2.1/tcp (proteus)/P10
WI-V2.1.0.17798 Firebird 2.1.WI-V2.1.0.17798 Firebird 2.1/tcp (proteus)/P10
Derby 10.05.03.00 Apache Derby
10.5.3.0 - (802917)
SQLite 03.06.14.02 SQLite
3.6.3
SQLServer 2005 Microsoft SQL Server
9.00.4053
SQLServer 2008 Microsoft SQL Server
10.00.2531
H2 1.2.126 H2
1.2.126 (2009-12-18)
HSQLDB 1.8.1 HSQL Database Engine
1.8.1

で、次が、各DBMSで実行したときの結果を整理したもの。

(01) COUNT(v), MAX(v), MIN(v), SUM(v), AVG(v)
    DB2 9.1, DB2 9.5, DB2 9.7, Derby 10.05.03.00
        "1", "2", "3", "4", "5"        
    Oracle 10g XE, H2 1.2.126
        "COUNT(V)", "MAX(V)", "MIN(V)", "SUM(V)", "AVG(V)"   
    PostgreSQL 8.3, PostgreSQL 8.4
        "count", "max", "min", "sum", "avg"      
    MySQL 5.1, SQLite 03.06.14.02
        "COUNT(v)", "MAX(v)", "MIN(v)", "SUM(v)", "AVG(v)"   
    Firebird 2.1
        "COUNT", "MAX", "MIN", "SUM", "AVG"      
    SQLServer 2005, SQLServer 2008, HSQLDB 1.8.1
        "", "", "", "", ""         
(02) COUNT(v) AS Count, MAX(v) AS Max, MIN(v) AS Min, SUM(v) AS Sum, AVG(v) AS Avg,
    DB2 9.1, DB2 9.5, DB2 9.7, Oracle 10g XE, H2 1.2.126
        "COUNT", "MAX", "MIN", "SUM", "AVG"      
    PostgreSQL 8.3, PostgreSQL 8.4
        "count", "max", "min", "sum", "avg"      
    MySQL 5.1, SQLite 03.06.14.02, SQLServer 2005, SQLServer 2008
        "Count", "Max", "Min", "Sum", "Avg"      
    Firebird 2.1, Derby 10.05.03.00, HSQLDB 1.8.1
        何らかの原因でエラー(後述)
(03) COUNT(v) AS "Count", MAX(v) AS "Max", MIN(v) AS "Min", SUM(v) AS "Sum", AVG(v) AS "Avg",
    DB2 9.1, DB2 9.5, DB2 9.7, Oracle 10g XE, PostgreSQL 8.3,
      PostgreSQL 8.4, MySQL 5.1, Firebird 2.1, Derby 10.05.03.00,
      SQLite 03.06.14.02, SQLServer 2005, SQLServer 2008,
      H2 1.2.126, HSQLDB 1.8.1
        "Count", "Max", "Min", "Sum", "Avg"      
(04) COUNT(v) AS C_Count, MAX(v) AS C_Max, MIN(v) AS C_Min, SUM(v) AS C_Sum, AVG(v) AS C_Avg,
    DB2 9.1, DB2 9.5, DB2 9.7, Oracle 10g XE, Firebird 2.1,
      Derby 10.05.03.00, H2 1.2.126, HSQLDB 1.8.1
        "C_COUNT", "C_MAX", "C_MIN", "C_SUM", "C_AVG"    
    PostgreSQL 8.3, PostgreSQL 8.4
        "c_count", "c_max", "c_min", "c_sum", "c_avg"    
    MySQL 5.1, SQLite 03.06.14.02, SQLServer 2005, SQLServer 2008
        "C_Count", "C_Max", "C_Min", "C_Sum", "C_Avg"    
(05) v+v, v-v, v*v, v/v, v*v+v/v-v
    DB2 9.1, DB2 9.5, DB2 9.7, Derby 10.05.03.00
        "1", "2", "3", "4", "5"        
    Oracle 10g XE
        "V+V", "V-V", "V*V", "V/V", "V*V+V/V-V" 
    PostgreSQL 8.3, PostgreSQL 8.4
        "?column?", "?column?", "?column?", "?column?", "?column?" 
    MySQL 5.1, SQLite 03.06.14.02
        "v+v", "v-v", "v*v", "v/v", "v*v+v/v-v" 
    Firebird 2.1
        "ADD", "SUBTRACT", "MULTIPLY", "DIVIDE", "SUBTRACT" 
    SQLServer 2005, SQLServer 2008, HSQLDB 1.8.1
        "", "", "", "", ""         
    H2 1.2.126
        "V + V", "V - V", "V * V", "V / V", "((V * V) + (V / V)) - V" 

意外とばらばら。しかも列名が空文字列というのがあるとは思わなかった。
さすがに、ダブルクォートで括ったケースでは各ベンダーで同じ結果となった。
なお、(02)の「(後述)」と書いたエラーというのは、「Count」とか「Max」というトークンがそんなところで出てくるのは間違っているよ、という類のもの。「C_Count」とか「C_Max」のように書き換えたケースではちゃんと通っている辺りからも、何か特別扱いしているのだろう。

ちなみに、実行したJavaプログラム。