IF(expr1,expr2,expr3)

expr1 が TRUE(expr1 <> 0 および expr1 <> NULL)の場合 IF() は expr2 を返し、
それ以外の場合は expr3 を返す。 IF() は、使用されているコンテキストに応じて、数値または文字列を返す。

IFNULL(expr1,expr2)

expr1 が NULL でない場合は expr1 を返し、それ以外の場合は expr2 を返す。IFNULL() は、
使用されているコンテキストに応じて、数値または文字列を返す。
※これは、MS SQLでいうISNULLにあたる。


mysql> SELECT IFNULL(@a, '@a is NULL');
+--------------------------+
| IFNULL(@a, '@a is NULL') |
+--------------------------+
| @a is NULL |
+--------------------------+
1 row in set (0.00 sec)

mysql> SELECT IF(@a,@a,'@a is null');
+------------------------+
| IF(@a,@a,'@a is null') |
+------------------------+
| @a is null |
+------------------------+
1 row in set (0.00 sec)

mysql> SET @a = 1;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT IF(@a,@a,'@a is null');
+------------------------+
| IF(@a,@a,'@a is null') |
+------------------------+
| 1 |
+------------------------+
1 row in set (0.00 sec)

mysql> SELECT IF(@a,@a,'@a is null');
+------------------------+
| IF(@a,@a,'@a is null') |
+------------------------+
| 1 |
+------------------------+
1 row in set (0.00 sec)

mysql>

mysql> SELECT IF(STRCMP('test','test1'),'no','yes');
+---------------------------------------+
| IF(STRCMP('test','test1'),'no','yes') |
+---------------------------------------+
| no |
+---------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT IF(STRCMP('test','test'),'no','yes');
+--------------------------------------+
| IF(STRCMP('test','test'),'no','yes') |
+--------------------------------------+
| yes |
+--------------------------------------+
1 row in set (0.00 sec)

mysql>

variable_ifnull1

参考サイト
6.3.1.4. フロー制御関数


CASE文などMYSQLでの制御フローは色々ありますが,
今回は以前検証したIF文の復習です。

制御フロー関数 IF
Unique Key が存在するテーブルへのデータINSERT処理


mysql> CREATE TABLE `USER` (
-> `id` int(4) DEFAULT NULL,
-> `NAME` varchar(20) DEFAULT NULL
-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.03 sec)

mysql> desc USER;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(4) | YES | | NULL | |
| NAME | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> insert into USER values(1,'USER1');
Query OK, 1 row affected (0.01 sec)

mysql> insert into USER values(2,'USER2');
Query OK, 1 row affected (0.00 sec)

mysql> insert into USER values(NULL,'USER3');
Query OK, 1 row affected (0.01 sec)

mysql> select * from USER;
+------+-------+
| id | NAME |
+------+-------+
| 1 | USER1 |
| 2 | USER2 |
| NULL | USER3 |
+------+-------+
3 rows in set (0.00 sec)

mysql> UPDATE USER SET id=IF(id is not null,id+1,0);
Query OK, 3 rows affected (0.00 sec)
Rows matched: 3 Changed: 3 Warnings: 0

mysql> select * from USER;
+------+-------+
| id | NAME |
+------+-------+
| 2 | USER1 |
| 3 | USER2 |
| 0 | USER3 |
+------+-------+
3 rows in set (0.00 sec)

mysql> UPDATE USER SET id=IF(id is not null,id+1,0);
Query OK, 3 rows affected (0.00 sec)
Rows matched: 3 Changed: 3 Warnings: 0

mysql> select * from USER;
+------+-------+
| id | NAME |
+------+-------+
| 3 | USER1 |
| 4 | USER2 |
| 1 | USER3 |
+------+-------+
3 rows in set (0.00 sec)

mysql>

user_test


IF(expr1,expr2,expr3)

expr1 が TRUE である場合は ( expr1 <> 0 および expr1 <> NULL ) 、
IF() は expr2 を戻します。それ以外では、expr3 を戻します。IF() は、
使用されている文脈によって、数値値もしくはストリング値を戻します。


mysql> SELECT IF(1<2,'yes','no'); +--------------------+ | IF(1<2,'yes','no') | +--------------------+ | yes | +--------------------+ 1 row in set (0.00 sec) mysql> SELECT IF(3<2,'yes','no'); +--------------------+ | IF(3<2,'yes','no') | +--------------------+ | no | +--------------------+ 1 row in set (0.00 sec) mysql>

if


mysql> SELECT
-> IF(comment IS NOT NULL,
-> CONCAT(comment,' IS VALID'),
-> 'IS NULL DATA')
-> AS 'Happy or Sad'
-> FROM test.a10;
+---------------+
| Happy or Sad |
+---------------+
| IS NULL DATA |
| IS NULL DATA |
| IS NULL DATA |
| IS NULL DATA |
| data IS VALID |
| test IS VALID |
+---------------+
6 rows in set (0.00 sec)

mysql>

if_not

11.2. 制御フロー関数