SELECTするとき、WHERE句で特定の日付の値を条件として使いたいが、その値が存在しなかったり期待するものと違ったりした時、別の日付をキーにする。
例えば以下は、base_dateカラムの日付をキーにしたいが、base_dateの値がNULLだったりMySQLのデフォルト値(0000-00-00)だったりすると、結果がおかしくなってしまう。
1 2 3 4 5 6 7 |
/* base_dateから数えて3日後の会員を取得 */ SELECT * FROM `tbl_user` WHERE DATEDIFF( CURRENT_DATE(), base_date ) = 3 |
なので、このbase_dateの値が期待するものと違えば、代替として、entryの値を使用したい。
CASEを使って対応。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
/* base_dateから数えて3日後の会員を取得 */ /* base_dateがNULLまたは0000-00-00ならentryの値を使用 */ SELECT * FROM `tbl_user` WHERE DATEDIFF( CURRENT_DATE(), ( CASE WHEN base_date IS NULL THEN entry WHEN base_date = '0000-00-00' THEN entry ELSE base_date END ) ) = 3 |
NULLだけを回避するのであれば、COALESCEを使えばいいっぽい。試してないが書くならこんな感じかしら。
1 2 3 4 5 6 7 8 |
/* base_dateから数えて3日後の会員を取得 */ /* base_dateがNULLならentryの値を使用 */ SELECT * FROM `tbl_user` WHERE DATEDIFF( CURRENT_DATE(), COALESCE(base_date, entry) ) = 3 |
参考サイト)
- https://www.dbonline.jp/sqlite/select/index13.html
- https://qiita.com/seiyaan/items/7bb377bc2b947bece454
- http://honey8823.hateblo.jp/entry/2015/08/21/111458
- https://qiita.com/mikakane/items/1e45c2a798d0c7edffda