列名を持たない列の列名(意味不明)
なんと言えばいいのか分からなかったので意味不明なタイトルになったが、要は次のようなクエリを実行したときの結果表の列名はどうなるのか、ということ。
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プログラム。