プログラ生活

プログラム初学者のためのポイントを書いていこうと思います。たまに脇道それた記事もありますが、息抜きだとおもって気長にお付き合いください。

【SQL Server(連載)】IF文 -24-

www.pon-x.jp

前回の続き

今回はIF ELSE文をやります。

PRINTコマンド

IF文とは直接関係ありませんが、PRINTコマンドというのを使いながらIF文の動きを見ていこうと思います。
SELECTはテーブルのデータを出力していたのに対して、PRINTはコメントが表示されるということに違いがあります。

PRINT('ABCDE')

こんなかんじに出力されます。
f:id:hanabusa-snow:20201209083254p:plain

IF ELSE文

では、本題に移ります。 IF ELSE文は、もし〇〇が真なら××を実行、そうでなければ△△を実行するということを行うのが目的です。
では試しに書いてみましょう。

IF 1 = 1
    PRINT('A')
ELSE
    PRINT('C')

以下の通り「A」が出力されます。
f:id:hanabusa-snow:20201209083506p:plain
これは、1=1が真であるため、IFの中身が実行されました。

では、以下はどうでしょう。

IF 1 = 2
    PRINT('A')
ELSE
    PRINT('C')

以下の通り「C」が出力されます。
f:id:hanabusa-snow:20201209083600p:plain
これは、1=2が偽であるため、ELSEの中身が実行されました。

さまざまな比較

上記では、等しいかという比較だけでしたが、さまざまな比較方法があります。
簡単に紹介します。

-- 否定 (3つとも、1と2は等しくないという表し方)
IF NOT 1 = 2
    PRINT('A')

IF 1 != 2
    PRINT('B')

IF 1 <> 2
    PRINT('C')

-- 大小関係
IF 1 < 2 -- 2は1より大きい
    PRINT('D')

IF 1 <= 2 -- 2は1以上
    PRINT('E')

こんなかんじ
f:id:hanabusa-snow:20201209084940p:plain

BEGIN ~ END

次に以下を試しに実行してみてください。

IF 1 = 1
    PRINT('A')
    PRINT('B')
ELSE
    PRINT('C')

以下の通りエラーになります。
f:id:hanabusa-snow:20201209084153p:plain これは、IFの中身に複数の処理がかかれているためにそうなりました。
SQLServerのIF ELSE文はその中で処理は1回しかおこなえません。
しかし、複数処理したいということはけっこうあるので、この問題を解決してくれるのがBEGIN ~ ENDです。
複数処理をBEGIN ~ ENDで括ってあげると、それらをまとめて一つの処理とみなしてくれます。

試しに以下の通りかいてみます。

IF 1 = 1
    BEGIN
        PRINT('A')
        PRINT('B')
    END
ELSE
    PRINT('C')

無事に2つのPRINTコマンドが実行されました。
f:id:hanabusa-snow:20201209084235p:plain

応用

では、これまで学んできたことと組み合わせて使ってみたいと思います。
以下のSQLに特別な意図はなく、あくまで練習なのでそういうようにとらえてください。

IF (SELECT PhoneNumberTypeID FROM Person.PersonPhone WHERE BusinessEntityID = 1) = 1
    BEGIN
        UPDATE Person.Person
        SET Suffix = 1
        WHERE BusinessEntityID = 1

        SELECT Suffix FROM Person.Person WHERE BusinessEntityID = 1
    END
ELSE
    PRINT('PASS')

説明をすると、Person.PersonPhoneのBusinessEntityIDが1のレコードを抽出し、さらにカラムをPhoneNumberTypeIDだけに抽出します。
BusinessEntityIDhPrimary keyなのでスカラの値で比較ができます。
もし、この結果が1と等しければ、Person.PersonのBusinessEntityIDが1のレコードにおけるSuffixを1に更新する処理を行い、さらにその結果をSELECTで表示します。
もし、IF文が偽であれば「PASS」という文字列をコメント表示させるという内容です。

ちなみに結果は真なので、以下の通りになるはずです。
f:id:hanabusa-snow:20201209085910p:plain







以上、今回はここまで。