一般的に、IF..ELSEは様々なプログラミング言語における意思決定文であると言われています。 IF文は、ある条件が満たされた場合に、コードのブロックを実行するために使用されます。 SQL Server の場合、IF 文は、条件が TRUE である場合に SQL 文を実行するために使用されます。
たとえば、次のようになります。
1
2
3
4
5
6
7
|
IF @table_name = ’employees’
SELECT * FROM sto_employees.LOOP
SELECT * FROM sto_employee; ELSE
SELECT * FROM sto_products; |
上のコードでは、@table_nameは変数です。 この変数に代入された値が「employees」であれば、IF文はsto_employeesテーブルからデータを取得することになります。
この簡単な使い方を、以下の例で出力しながらご紹介します。 最後に、SQL Serverにはない「ELSE IF」の目的を果たす方法も説明します。
ELSEを使わないIF文の簡単な例
まず、SQL文のIFを使った簡単な例から説明します。 int型変数を評価し、その値を確認します。 条件がTRUEであれば、IF文はステートメントを表示するはずです。
そのコードです。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
/* 変数の宣言*/
DECLARE @val_chk INT;
/* 値の代入*/
SET @val_chk = 101;
/* IF 文の実行*/
IF @val_chk = 101
PRINT ‘IF 文は TRUE’ とする。
GO
|
上記コードの出力は以下の通りです。
“The IF statement is TRUE”
その結果、変数の値は101となります。
条件がFALSEだったら?
上記の条件がFALSEだった場合、例えば変数の値が101以外だった場合、何も起こりません。
実際のシナリオでは、IF文の条件が真または偽であるため、文を実行したり何らかの動作を実行したい場合があります。 ELSE文の中の文は、IF文の中の条件が満たされない場合に実行されます。
ELSEステートメントを使用したデモを以下に示します。
IF ELSE CODE:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
/* 変数の宣言*/
DECLARE @val_chk INT;
/* 値の代入*/
SET @val_chk = 50;
/* IF文の実行*/
IF @val_chk >= 101
PRINT『IF文は真です』.IF文の実行*/
SET @val_chk = 50;
SET @val_chk = 50;
SET @val_chk = 50;
SET @val_chk = 50 ELSE
PRINT ‘The IF statement is FLASE’;
GO
|
上記のコードの出力は、。 変数の値が101以上でないため、「IF文はFALSE」です。
VARCHARの値に基づいてSELECT文を実行する
さて、IF文に文字列値を使う例を紹介しましょう。 文字列変数を宣言し、値を代入します。
IF…ELSEステートメントでは、変数の値を確認し、それぞれのSELECTステートメントを実行することにします。 見てみてください。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
/* 文字列変数の宣言*/
DECLARE @table_name VARCHAR(60) です。
/* 値の代入*/
SET @table_name = ’employees’;
/* IF文の実行*/
IF @table_name = ’employees’
SELECT * FROM sto_employees;
ELSE
SELECT * FROM sto_products; GO
|
上記コードの出力は、以下の通りです。
チェックする選択肢が複数ある場合はどうすればよいでしょうか。 (NESTED IF)
上記の例では、選択肢は2つだけでした。 値が TRUE か FALSE のどちらかです。 TRUEであればIFの中のステートメントが実行され、そうでなければELSE部分が実行されます。
SELECTステートメントを実行する場合、異なるテーブル名をチェックし、それぞれについてSELECTステートメントを実行する必要があるとします。
たとえば、変数の値が ’employees’ である場合、次のように実行します:
SELECT * FROM sto_employees;
値が products である場合、次のように実行します:
SELECT * FROM sto_employees;
値が ‘products’ である場合、次のように実行します。
SELECT * FROM sto_products;
他の値の場合:
SELECT * FROM sto_emp_salary_paid;
これがSQLでNESTED IF文にどう変換されるか見てみましょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
/* 文字列変数の宣言*/
DECLARE @table_name VARCHAR(60) です。
/* 値の代入*/
SET @table_name = ‘products’;
/* IF文の実行*/
IF @table_name = ’employees’
SELECT * FROM sto_employees;
ELSE
BEGIN
IF @table_name = ‘products’
SELECT * FROM sto_products.SELECT
IF @table_name = ‘products’
SELECT * FROM sto_products;
ELSE
SELECT * FROM sto_emp_salary_paid;
END ;
GO
|
ELSE 文の中で、他の IF 文が配置されているところに BEGIN キーワードを使っていますね(入れ子 IF です)。 これは、ENDキーワードを使用して終了されます。
そこで、チェックする別の条件を配置しました。 変数@table_nameの値を自分のテーブル名で変えてみて、SELECT文でも置き換えてみてください。
Going another level in NESTED IF statement
Just for showing that you may nest to many levels, I am gone further by using another nested IF statement.
So, scenario is to check the value of a variable (table_name).if the value is products then retrieve the data from sto_products table.The case is the value of a product, but also as to see it yourself. もし値がemployeesであれば、sto_employeesのレコードを取得します。 3番目のifは、変数の値がordersであれば、ordersテーブルからレコードを取得します。
最後に、変数の他の値に対するELSEステートメントは、従業員の給与が支払わテーブルのレコードを取得する必要があります。
3つの条件にELSEを加えた複数のネストされたIF文をご覧ください。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
/*文字列変数の宣言*/
DECLARE @table_name VARCHAR(60) です。
/* 値の代入*/
SET @table_name = ‘orders’;
/* IF文の実行*/
IF @table_name = ’employees’
SELECT * FROM sto_employees;
ELSE
BEGIN
IF @table_name = ‘products’
SELECT * FROM sto_products.SELECT
IF @table_name = ‘products’
SELECT * FROM sto_products;
ELSE
BEGIN
IF @table_name = ‘orders’
SELECT * FROM sto_orders;
ELSE
SELECT * FROM sto_emp_salary_paid;
END ;
END ;
GO
|
変数にordersと設定したので、IF文はsto_ordersテーブルからのレコードを返すはずです。
コードでは、3番目のIF文が2番目のBEGINキーワードの後に開始されていることがわかります。
注意:SELECT文の条件実行を使用したい場合は、SQLのCASE文を使用します。