Quantcast
Channel: Planet MySQL
Viewing all articles
Browse latest Browse all 1081

使い慣れたSQLに潜む実装依存: Firebirdの場合(10) ORDER BY でのNULLの扱い

$
0
0
本エントリはFirebird Adventcalendar 2016の17日目です。

使い慣れたSQLに潜む実装依存:3.構文とトランザクション ORDER BY

最新のFirebird 3.xでは、MySQL, SQL serverと同様にNULLは最小として扱われます。

SQL&gt create table table_name(column_name int);
SQL&gt insert into table_name values(1);
SQL&gt insert into table_name values(2);
SQL&gt insert into table_name values(3);
SQL&gt insert into table_name values(null);
SQL&gt insert into table_name values(null);
SQL&gt comiit;

SQL&gt select * from table_name order by 1;

COLUMN_NAME
============
&ltnull&gt
&ltnull&gt
1
2
3

SQL&gt select * from table_name order by 1 desc;

COLUMN_NAME
============
3
2
1
&ltnull&gt
&ltnull&gt

またNULLS FIRST, NULLS LASTもサポートされています(Firebird 1.5以降)

SQL&gt select * from table_name order by 1 asc nulls last;

COLUMN_NAME
============
1
2
3
&ltnull&gt
&ltnull&gt

SQL&gt select * from table_name order by 1 desc nulls first;

COLUMN_NAME
============
&ltnull&gt
&ltnull&gt
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テーマ:コンピュータ


Viewing all articles
Browse latest Browse all 1081

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>