エンジニア足立のコーディング日記

エンジニア足立のコーディング日記

RSS MySQLのCASE文

公開日:2017年08月10日
この記事を読むのに掛る所要時間: 355

現在、簡単な掲示板のようなシステムを作成しているのですが、

 

その際に少しつまずいたので、

 

記録がてら情報をまとめておくことにしました。

 

今回はお客さんからの要望で、掲示板に記事を投稿する際に、

・ステータスフラグ(0:公開保留 1:公開中)
・記事の公開開始日
・記事の公開終了日

という項目を持たせることになりました。

 

ただ、お客さんから、

 

管理画面から記事を検索した場合に、

 

記事の検索結果一覧には、

「ステータスフラグ」に「0」が立っている場合 => 公開保留
「ステータスフラグ」に「1」が立っている かつ 当日が「公開開始日」と「公開終了日」の間の場合 => 公開中
「ステータスフラグ」に「1」が立っている かつ 「公開開始日」がまだ来ていない場合 => 公開前
「ステータスフラグ」に「1」が立っている かつ 「公開終了日」が過ぎてしまっている場合 => 公開終了

と表示させてほしいとの要望が。。。

 

表示させるだけであれば、プログラム側でそのように処理してやればいいだけなので問題ないのですが、

 

更にその順番にソート出来る機能を付けて欲しいとのこと。。。

 

「ステータスフラグ」には「0」と「1」しか存在しません。

 

その為、「ステータスフラグ」でソートしても「公開中」「公開前」「公開終了」の並びがバラバラになってしまいます。

 

そんな時に便利なのがCASE文です。

 

↓これ↓
=========================
CASE
WHEN 条件1 THEN 処理
WHEN 条件2 THEN 処理
WHEN 条件3 THEN 処理

ELSE 処理
END
=========================

 

今回の場合であれば、

・ステータスフラグ => カラム名:openStatus

・記事の公開開始日 => カラム名:openStart

・記事の公開終了日 => カラム名:openEnd

だったとすると、

 

ORDER BY句はこんな感じになります↓↓
===============================================================================
ORDER BY CASE
WHEN (openStatus = 0) THEN 0
WHEN (openStatus=1) and (openStart<=’当日’) and (openEnd>=’当日’) THEN 3
WHEN (openStatus=1) and (openStart>’当日’) THEN 4
WHEN (openStatus=1) and (openEnd<‘当日’) THEN 5
ELSE 6 END ASC
===============================================================================
※降順に並べる場合には「ASC」を「DESC」にすればOK!

 

なので、今回の案件であればこんなSQLを書いてやれば対応可能です。
===============================================================================
SELECT 取得したいカラム名 FROM テーブル名 WHERE 条件
ORDER BY CASE
WHEN (openStatus = 0) THEN 0
WHEN (openStatus=1) and (openStart<=’当日’) and (openEnd>=’当日’) THEN 3
WHEN (openStatus=1) and (openStart>’当日’) THEN 4
WHEN (openStatus=1) and (openEnd<‘当日’) THEN 5
ELSE 6 END ASC
===============================================================================

このページのTOPへ戻る

著者情報

足立 拓也(あだち たくや)
1980年生まれ。
出身:兵庫県丹波市。
趣味:ボクシングジム通い。
特技:歴史の話しをすること。
一言:頑張って面白いブログを書きます。

月別アーカイブ

  •  

    • [—]2017 (67)
    • [+]2016 (49)
    • [+]2015 (86)
    • [+]2014 (81)
    • [+]2013 (104)
    • [+]2012 (78)