本エントリはFirebird Adventcalendar 2016の17日目です。
使い慣れたSQLに潜む実装依存:3.構文とトランザクション ORDER BY
最新のFirebird 3.xでは、MySQL, SQL serverと同様にNULLは最小として扱われます。
SQL> create table table_name(column_name int);
SQL> insert into table_name values(1);
SQL> insert into table_name values(2);
SQL> insert into table_name values(3);
SQL> insert into table_name values(null);
SQL> insert into table_name values(null);
SQL> comiit;
SQL> select * from table_name order by 1;
COLUMN_NAME
============
<null>
<null>
1
2
3
SQL> select * from table_name order by 1 desc;
COLUMN_NAME
============
3
2
1
<null>
<null>
またNULLS FIRST, NULLS LASTもサポートされています(Firebird 1.5以降)
SQL> select * from table_name order by 1 asc nulls last;
COLUMN_NAME
============
1
2
3
<null>
<null>
SQL> select * from table_name order by 1 desc nulls first;
COLUMN_NAME
============
<null>
<null>
3
2
1
Firebird 特有の仕様として、Firebird 1.xではNULLは必ずSORT結果の最後にくる、
というものがありました。これは2.0で現在の仕様(最小)に変更されました。詳細は
次のドキュメントをご参照ください。
Sorts
ミックさんが翻訳した「プログラマのためのSQL 第4版」でも7.3.2 ORDER BY句にて
同様のトピックがあがっています。しかしNULLS FIRST, NULLS LASTを「これはもともと、DB2と
Oracleに実装されていた機能だ。」というのは誤りでは? というのも、LUW版DB2で
NULLS FIRST, NULLS LASTがサポートされたのは9.x (おそらくは9.5)ですから。
SQL ServerのようにNULLS FIRST, NULLS LASTをサポートしてない環境にて
ORDER BY時のNULLの出現位置をコントロールしたい場合は、以下のブログエントリを参考にしてください。
FirebirdSQLパズル: 2-1-18 nulls Firstとnulls Last(キムラデービーブログ)
この方法はDBFluteでも利用されたようです :)
MySQLではVal IS NULLを使うこともできます。
使い慣れたSQLに潜む実装依存:3.構文とトランザクション ORDER BY
最新のFirebird 3.xでは、MySQL, SQL serverと同様にNULLは最小として扱われます。
SQL> create table table_name(column_name int);
SQL> insert into table_name values(1);
SQL> insert into table_name values(2);
SQL> insert into table_name values(3);
SQL> insert into table_name values(null);
SQL> insert into table_name values(null);
SQL> comiit;
SQL> select * from table_name order by 1;
COLUMN_NAME
============
<null>
<null>
1
2
3
SQL> select * from table_name order by 1 desc;
COLUMN_NAME
============
3
2
1
<null>
<null>
またNULLS FIRST, NULLS LASTもサポートされています(Firebird 1.5以降)
SQL> select * from table_name order by 1 asc nulls last;
COLUMN_NAME
============
1
2
3
<null>
<null>
SQL> select * from table_name order by 1 desc nulls first;
COLUMN_NAME
============
<null>
<null>
3
2
1
Firebird 特有の仕様として、Firebird 1.xではNULLは必ずSORT結果の最後にくる、
というものがありました。これは2.0で現在の仕様(最小)に変更されました。詳細は
次のドキュメントをご参照ください。
Sorts
ミックさんが翻訳した「プログラマのためのSQL 第4版」でも7.3.2 ORDER BY句にて
同様のトピックがあがっています。しかしNULLS FIRST, NULLS LASTを「これはもともと、DB2と
Oracleに実装されていた機能だ。」というのは誤りでは? というのも、LUW版DB2で
NULLS FIRST, NULLS LASTがサポートされたのは9.x (おそらくは9.5)ですから。
SQL ServerのようにNULLS FIRST, NULLS LASTをサポートしてない環境にて
ORDER BY時のNULLの出現位置をコントロールしたい場合は、以下のブログエントリを参考にしてください。
FirebirdSQLパズル: 2-1-18 nulls Firstとnulls Last(キムラデービーブログ)
この方法はDBFluteでも利用されたようです :)
MySQLではVal IS NULLを使うこともできます。
JUGEMテーマ:コンピュータ