2016年6月14日火曜日

DBまとめ1:SQLソート、それをZend_DB使って

以下のようなテーブルrosterがあったとする。
+----+--------+
| id | name   |
+----+--------+
|  1 | Daniel |
|  2 | NULL   |
|  3 | Bob    |
|  4 | Alice  |
|  5 | Carol  |
+----+--------+
単に ORDER BY key_col ASC とするとNULLが先頭にくる。
mysql> SELECT * FROM roster ORDER BY name ASC;
+----+--------+
| id | name   |
+----+--------+
|  2 | NULL   |
|  4 | Alice  |
|  3 | Bob    |
|  5 | Carol  |
|  1 | Daniel |
+----+--------+
NULLを最後にもってきたい場合は次のように書く。
mysql> SELECT * FROM roster ORDER BY name IS NULL ASC, name ASC;
+----+--------+
| id | name   |
+----+--------+
|  4 | Alice  |
|  3 | Bob    |
|  5 | Carol  |
|  1 | Daniel |
|  2 | NULL   |
+----+--------+
key_col IS NULL ASC でNULLが最後になるのでそのあと key_col ASC で昇順にソートする。


ORACLE とかだと下記のように簡単に
ORDER BY comment ASC NULL LAST
NULLS FIRST
NULL 値を順序の最初にするソートを行なう
NULLS LAST
NULL 値を順序の最後にするソートを行なう

このorderをZend使って

$select->order(new Zend_Db_Expr('case when MyDate is null then 1 else 0 end, MyDate'));



○参考
 Zend Framework order by ascending null values last
 [MySQL] 昇順ソートでNULLを最後にする方法
 MySQLでNULLを含む列をORDER BYしたときの挙動
 MySQL のソート時に NULL を最後にしたい場合
 MySQL で NULL を一番最後にして昇順にソートする