SQLのifの構文、DBMSごとの違いや注意点についてまとめています。
SQLのifの構文
if文は、標準SQLではストアドプロシジャやストアドファンクションでのみ使用できます。
IF 条件A THEN SQL文A [ELSEIF 条件B THEN SQL文B] ... [ELSE SQL文C] END IF
条件Aが真ならSQL文Aを、条件Bが真ならSQL文Bを、IF条件のどれにも当てはまらないならSQL文Cを実行します。elseifは複数記述が可能で、入れ子にすることもできます。
なお、DBMSによっては、elseifがelsifのケースがあるので注意が必要です。
以下は、MySQLのストアドファンクション内での使用例です。
DELIMITER // CREATE FUNCTION CheckNULL(name varchar(30)) RETURNS VARCHAR(20) BEGIN declare msg varchar(20); declare depname varchar(20); select dept_name into depname from departments where dept_no=num; if depname IS NULL then set msg = 'NULL'; else set msg=depname; END IF; END DELIMITER ;
【関連記事】
▶SQL if文のサンプルコード集 NULL判定や、Switch文のような分岐をする方法
DBMSごとのIF文の構文
Oracleのif文
oracleのPL/SQLは通常のSQL文内でif文を使用できます。以下の形式を使用可能。elseifではなく、elsifになっている点に注意です。
- IF THEN
- IF THEN ELSE
- IF THEN ELSIF
下記はsales(売上)がquota+200以上なら、bonus(ボーナス)をsalary(給与)に加算するSQLです。
SQL> DECLARE 2 sales NUMBER(8,2) := 10100; 3 quota NUMBER(8,2) := 10000; 4 bonus NUMBER(6,2); 5 emp_id NUMBER(6) := 120; 6 BEGIN 7 IF sales > (quota + 200) THEN 8 bonus := (sales - quota)/4; 9 10 UPDATE employees SET salary = 11 salary + bonus 12 WHERE employee_id = emp_id; 13 END IF; 14 END; 15 / PL/SQL procedure successfully completed. SQL>
SQL Serverのif文
SQL ServerのT-SQLは、通常のSQL内でif文を使用できます。
下記は、本日の曜日がSaturdayまたはSundayならWeekendを、そうでなければWeekdayを出力するSQLです。
IF DATENAME(weekday, GETDATE()) IN (N'Saturday', N'Sunday') SELECT 'Weekend'; ELSE SELECT 'Weekday';
参考)IF…ELSE (Transact-SQL) – SQL Server | Microsoft Docs
MySQLのif文
MySQLでは、ストアドプロシジャまたはストアドファンクション内でのみif文が使用可能です。主要DBMSでは、通常SQL内でif文を使えないのはMySQLのみなんですね。
下記は、ストアドファンクションVerboseCompareに与えられた引数nとmを比較し、等しければequalsを、n>mならis greater thanを、どちらでもなければis less thanをローカル変数sにセットし、n is xxx m ( xxxにはsの値が入る)を出力します。
DELIMITER // CREATE FUNCTION VerboseCompare (n INT, m INT) RETURNS VARCHAR(50) BEGIN DECLARE s VARCHAR(50); IF n = m THEN SET s = 'equals'; ELSE IF n > m THEN SET s = 'greater'; ELSE SET s = 'less'; END IF; SET s = CONCAT('is ', s, ' than'); END IF; SET s = CONCAT(n, ' ', s, ' ', m, '.'); RETURN s; END // DELIMITER ;
関連)MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.6.5.2 IF 構文
また、MySQLにはIF文とは別にif関数というものがあります。機能は簡易的なcase式のようなもので、単一の条件式に対して真の場合と偽の場合とで異なる値を返すことができます。
IF(expr1,expr2,expr3)
使用例は以下の通り。expr1が真ならexpr2を、そうでなければexpr3を返します。
mysql> SELECT IF(1>2,2,3); -> 3 mysql> SELECT IF(1<2,'yes','no'); -> 'yes' mysql> SELECT IF(STRCMP('test','test1'),'no','yes');
関連)MySQL :: MySQL 5.6 リファレンスマニュアル :: 12.4 制御フロー関数
PostgreSQLのif文
PL/pgSQLでは、if文をそのまま使用可能です。IF-THEN, IF-THEN-ELSE,IF-THEN-ELSE IF, and IF-THEN-ELSIF-THEN-ELSE という4パターンがあります。
シンプルなif文の構造は以下の通り。
IF v_user_id <> 0 THEN UPDATE users SET email = v_email WHERE user_id = v_user_id; END IF;
ELSEやELSIFを組み合わせた例は以下の通り。下記の例では、elseはnumberがどのような値でも実行されないので、else部分は省略可能です。
IF number = 0 THEN result := ''zero''; ELSIF number > 0 THEN result := ''positive''; ELSIF number < 0 THEN result := ''negative''; ELSE -- hmm, the only other possibility is that number IS NULL result := ''NULL''; END IF;
まとめ
- if文は、標準SQLではストアドプロシジャやストアドファンクション内でのみ使用可能
- if文にはelsifやelseで複数の条件を指定可能で、入れ子にすることもできる。
- DBMSによっては、elseifの場合やelsifの場合がある。