実戦的にSQL文を条件分岐させる3つの方法!

みなさんこんにちは!フリーランスプログラマーのsatoです。

SQLを組んでいく中で

条件分岐したいなぁ
なんて時があると思います。今回はそんな条件分岐についてです。実践でよく発生する3パターンの状況ごとの分岐方法をまとめておきました。ぜひ参考にしてみてください。

目次

方法①基礎中の基礎!CASE式を使用する!

CASE式を使えば、非常に簡単に分岐処理を書くことができます。基本的に以下のように、条件式を書いて分岐を行います。

SELECT
  CASE
      WHEN [条件1] THEN [条件1を満たしたら表示する内容]
      ELSE [条件を満たしていなかったら表示する内容]
  END
FROM [テーブル名];

「例えば点数ごとで表示を変更する」なんて処理を書くのならば以下のようになるでしょう。

SELECT
  name,point,
  CASE
      WHEN 80 <= point THEN "合格"
      ELSE "不合格"
  END
FROM user;

簡単ですね!詳細は以下の記事にまとめていますので、ぜひ参考にしてみてください。

方法②NULLチェックだけならばIFNULL

分岐を行いたい理由として、よく発生するのがNULLだったらで分岐したい状況ではないでしょうか。その状況ではCASE式を使うまでもありません。IFNULLを使用すれば、簡単に実現できます。使い方は以下の通りです。

SELECT IFNULL([チェックする要素], [NULLだったときに表示する文字列]) FROM [テーブル名];

より具体的に見てみましょう。userテーブルの、名前がNULLのユーザーのみ「NoName」と表示したかったとしましょう。その場合は以下の通りです。

SELECT IFNULL(name, "NoName") FROM user;

方法③外部情報による分岐ならシェルスクリプトで!

例えば…

現在のサーバー変数などによって処理を分岐させたい
出力した結果の取得方法も分岐したい

などなど…さらに特殊なことをやる場合はどうすれば良いのでしょうか?その場合は、シェルスクリプトなどを組んで進めてしまうのが手っ取り早いでしょう。例えばMySQLでの書き方ならば、以下のような記述方法で分岐することができるでしょう。

以下は非常に簡単に、rootユーザーで、blog_testDBを適当にSELECTしてきている例です。

#!/bin/sh
NUM1=100
NUM2=200

if [ $NUM1 -lt $NUM2 ]; then
mysql -u root blog_test -e "select * from user;"
else
mysql -u root blog_test -e "select * from user limit 1;"
fi

今回やっていることは変数二つのどちらが大きいかで分岐しているだけの処理ですが…うまく使えば、様々な分岐のさせ方ができますね!SQLはオプションで、そのままコマンドを投げることが可能なので、各自環境のやり方を調べておきましょう。

またシェルスクリプトの基本的な文法がわからない人は、以下で学んでみてください。

まとめ

今回は非常に簡単にですが、SQL上でのIF文のような分岐処理のやり方を見てきました。

  • 方法①基礎中の基礎!CASE式を使用する!
  • 方法②NULLチェックだけならばIFNULL
  • 方法③外部情報による分岐ならシェルスクリプトで!
  • 特に最後のシェルスクリプトでの対応方法は、実践での緊急時に、お世話になることも多いでしょう。より高みを目指す方は、一つの技術としてぜひともマスターしておきましょう。

    この記事を書いた人

    学生時代を含めると、かれこれ10年以上プログラマーとして過ごしています。
    様々な言語や環境、プロジェクトに関わってきましたので、より実践的な記事をみなさんにお届きるよう情報発信していきます!

    目次