SQL if文のサンプルコード集 NULL判定や、Switch文のような分岐をする方法
  • facebookページ
  • twitterページ
  • 2019.08.20

    SQL if文のサンプルコード集 NULL判定や、Switch文のような分岐をする方法

    たまに使うと、構文エラーを連発してしまうSQLのif文。

    「どうだったっけ?」と迷った時のために、コピペで実行結果を確認できる、SQLのif文サンプルコードをご紹介します。

    ※サンプルコードは、MySQL用です。

    SQLのif文の書き方は、データベースごとに異なる

    SQLのif文の構文は、主要データベースだけでも微妙に書き方が異なります。

    MySQL、Oracleのif文の構文

    MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.6.5.2 IF 構文

    なお、MySQLのIFステートメントは、ストアドプロシージャまたはストアドファンクション内でのみ使用可能です。

    SQL Serverのif文の構文は「THEN」がない

    SQL Serverの場合は、「THEN」がありません。また、「ELSEIF」は、「ELSE IF」という記述になります。

    IF文の終わりを示す「END IF」がないため、処理分が複数行ある場合は「BEGIN」と「END」で処理文を囲む必要があります。

    IF…ELSE (Transact-SQL) – SQL Server | Microsoft Docs

    SQLのif文のサンプルコード

    以下に、コピペで動作を確認できるSQLサンプルコードをご紹介いたします。

    データベースとして、MySQLのサンプルデータベースEmployeesを使っています。SQL実行結果の表示にはphpMyAdminを使用。

    SQLのif文でNULL判定するサンプルコード

    サンプルデータベースemployeesのテーブルdepartmentsを、与えられた引数「name」で検索し、dept_name(部署名)がNULLだったら「NULL」、それ以外なら部署名を返すストアドファンクションです。

    ポテパンダの一言メモ

    MySQLは、SQLに「;」(セミコロン)が出現すると、問答無用でSQLを実行する仕様になっています。

    ここでは、ストアドファンクションの一部としてセミコロンを使いたいため、一時的に区切り文字を「DELIMITER //」で、「//」に切り替えています。

    departmentsテーブルの中身は以下の通り。

    departmentテーブル

    引数にd001(Marketing)を指定して実行した結果は以下の通り。

    d001を指定した実行結果

    引数にd010(存在しない部署ID)を指定して実行した結果は以下の通り。

    d010を指定した実行結果

    場合によっては、NULLの場合は別の値を返すIFNULL関数を使ったほうが、処理が簡単な場合もあります。Oracle、SQL Serverでは、NVL()という関数が用意されています。

    SQLのif文でSwitch文のように複数の条件文を指定するには、if文を並べる

    引数によって、処理する内容を変えたい場合、C言語やJavaっぽくSwitch文のようにコードを書きたくなりますよね。

    if文を単純に並べることで、それっぽく記述することができます。

    SQLのIF文のネスト(入れ子)するサンプルコード

    さらに複雑に、特定の条件下で別のif文を使いたい場合は、入れ子にすることが可能です。

    上記のコードは、employeesテーブルにて、first_nameと引数nameが等しいレコードをカウントし、件数を返します。100件以上なら、「(too many)」を件数の後ろに付加し、0件なら「Not Found」を返します。

    引数に「Kyoichi」を指定した実行結果。251人も居る!

    Kyoichiを指定した実行結果

    引数に「Taro」を指定した実行結果。一人も居ない。

    Taroを指定した実行結果

    なお、2012年頃のブログに「MySQLのIF文の入れ子にインデント(字下げ)を入れたらエラーになった」という情報がありました。

    MySQLのストアドプロシージャでIF文のインデントはNGぽい – Big Bang

    最新のMySQLでは、インデントを入れても全く問題ありませんでした。古いMySQLではインデントに関する不具合があったのかも知れません。

    if exists句を使って、存在するときのみテーブルやプロシージャをドロップする

    同じifでも全くの別物で「if exists句」があります。

    テーブルやプロシージャをcreateするSQL内で、「もしすでにテーブルやプロシージャが存在したらdrop」という処理をする際に良く使われます。

    以下、テーブル「dtable」が存在する場合のみ、dtableをdropするSQLです。

    SQLの条件分岐は、 if文よりもcase式が簡単なケースもある

    SQLのif文は、バッチ処理的な条件分岐に向いています。しかし、一つのSQL内で、データによって処理内容を変えたい場合などは、case式を使うほうがはるかに簡単です。

    関連)SQLのCASE式サンプル集 order byやgroup byとの組み合わせもバッチリ


    ポテパンが提供するサービスについて

    本メディア「ポテパンスタイル」を運営する株式会社ポテパンは、エンジニアキャリア領域で複数サービスを提供しています。

    ポテパンフリーランス

    ポテパンフリーランス

    フリーランスエンジニアの方に高単価案件をご紹介しております。弊社ではフリーランス案件を常時300件ほど保有しており、その中からあなたに適した案件をご案内いたします。また、これから独立してフリーランスになる方の無料個別相談も承っております。フリーランスになった後の案件獲得方法やお金面(税金や保険など)についてお答えいたします!フリーエンジニアになりたい方向けのコンテンツも盛りだくさんです。

    ポテパンキャリア

    ポテパンキャリア

    エンジニア職専門の転職エージェントです。ポテパンキャリアでは、技術のわかるエージェントがあなたの転職をサポートします。エージェント自身がエンジニアなので、あなたと同じ目線で仕事内容や今後のキャリアについて一緒に考えることができます。年収800万円以上のハイスペック転職をご希望の方は「ポテパンプロフェッショナル」もご用意しておりますのでご利用下さいませ。

    ポテパンキャンプ

    ポテパンキャンプ

    ポテパンキャンプでは、RubyにてゼロからオリジナルのECサイトを作り上げてる3ヶ月間の実践型カリキュラムを提供しております。すでに本スクールの卒業生は、エンジニア職として様々な企業様に就職しております。なお、本スクールは受講料25万円と他社スクールに比べ格安となっており、またポテパンからご紹介させていただいた企業へ就職が決まった場合は、全額キャッシュバックいたします。



    株式会社ポテパンは、企業とエンジニアの最適なマッチングを追求しています。気になるサービスがあれば、ぜひ覗いてみてください!

    ポテクラバナー ポテプロバナー

    この記事をシェア

    • Facebookシェア
    • Twitterシェア
    • Hatenaシェア
    • Lineシェア
    pickup









    ABOUT US

    ポテパンはエンジニアと企業の最適なマッチングを追求する企業です。

    READ MORE

    ポテパンおすすめ案件