MySQL内部関数フロー制御関数
- IFNULL(a, b)〔IFNULL()〕
- ヌル判定〔COALESCE()〕
- ヌル比較〔NULLIF()〕
- IF(a, b, c)〔IF()〕
- 多重判定〔CASE〕
- このページで使用しているサンプルデータ
IFNULL(a, b)
IFNULL()
unknown
IFNULL(a, b)
aがNULLでない場合はaを返し、それ以外の場合はbを返します。
IFNULL()関数は、使用されているコンテキストに応じて、数値または文字列を返します。
mysql> SELECT IFNULL(1, 0); Enter +--------------+ | IFNULL(1, 0) | +--------------+ | 1 | +--------------+ 1 row in set (0.05 sec) mysql> SELECT IFNULL(NULL, 10); Enter +------------------+ | IFNULL(NULL, 10) | +------------------+ | 10 | +------------------+ 1 row in set (0.58 sec) mysql> SELECT IFNULL(1/0, 10); Enter +-----------------+ | IFNULL(1/0, 10) | +-----------------+ | 10 | +-----------------+ 1 row in set (0.06 sec) mysql> SELECT IFNULL(1/0, 'YES'); Enter +--------------------+ | IFNULL(1/0, 'YES') | +--------------------+ | YES | +--------------------+ 1 row in set (0.00 sec)
ヌル判定
COALESCE()
unknown
COALESCE(a, b, c)
coalesce()関数は、最初のNULLでないデータを返します。
mysql> SELECT COALESCE(NULL, 'YES', 'NO'); Enter
+---------------------------+
| coalesce(null,'YES','NO') |
+---------------------------+
| YES |
+---------------------------+
1 row in set (0.00 sec)
ヌル比較
NULLIF()
unknown
NULLIF(a, b)
NULLIF()関数は、等しければNULLを返し、等しくなければaが返ります。
a = b
がTRUEの場合はNULLを返し、それ以外の場合はaを返します。
これはCASE WHEN x = y THEN NULL ELSE x END
と同じです。
mysql> SELECT NULLIF(1, 1); Enter +--------------+ | NULLIF(1, 1) | +--------------+ | NULL | +--------------+ 1 row in set (0.00 sec) mysql> SELECT NULLIF(1, 2); Enter +--------------+ | NULLIF(1, 2) | +--------------+ | 1 | +--------------+ 1 row in set (0.00 sec)
IF(a, b, c)
IF()
unknown
IF(a, b, c)
aがTRUE(a<>0 および a<>NULL)の場合、 IF() はbを返し、それ以外の場合はcを返します。 IF()関数は、使用されているコンテキストに応じて、数値または文字列を返します。
mysql> SELECT IF(1>2, 2, 3); Enter +---------------+ | IF(1>2, 2, 3) | +---------------+ | 3 | +---------------+ 1 row in set (0.07 sec) mysql> SELECT IF(1<2, 'YES', 'NO'); Enter +----------------------+ | IF(1<2, 'YES', 'NO') | +----------------------+ | YES | +----------------------+ 1 row in set (0.00 sec) mysql> SELECT IF(STRCMP('test', 'test1'), 'NO', 'YES'); Enter +------------------------------------------+ | IF(STRCMP('test', 'test1'), 'NO', 'YES') | +------------------------------------------+ | NO | +------------------------------------------+ 1 row in set (0.67 sec)
多重判定
CASE
unknown
CASE 値 WHEN [compare-value] THEN result [WHEN [compare-value] THEN result ...][ELSE result] END , CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...][ELSE result] END
最初の式では、value=compare-valueであるresult値を返します。
2番目の式では、最初の条件がTRUEなら、そのresult値を返します。
一致する結果が検出されない場合は、ELSE後のresult値を返します。
ELSE部分がない場合は、NULLを返します。
戻り値の型(INTEGER、DOUBLE、またはSTRING)は最初の戻り値(最初のTHEN後の式)の型と同じ。
# tbl_Customerテーブルの内容 mysql> SELECT * FROM tbl_Customer; Enter +--------+-----------+----------+------+------+ | UserID | FirstName | LastName | Sex | Age | +--------+-----------+----------+------+------+ | U001 | 花子 | 鈴木 | f | 21 | | U002 | 太郎 | 田中 | m | 30 | | U003 | 一郎 | 鈴木 | m | 45 | | U004 | 萌子 | 山口 | f | 18 | | U005 | 愛 | 森永 | f | 21 | | U006 | 太郎 | 鈴木 | m | 22 | | U007 | 花子 | 佐藤 | f | 35 | +--------+-----------+----------+------+------+ 7 rows in set (0.01 sec) mysql> SELECT Age, Enter -> CASE Enter -> WHEN Age>=10 AND Age<=19 THEN '10代' Enter -> WHEN Age>=20 AND Age<=29 THEN '20代' Enter -> WHEN AGE>=30 AND Age<=39 THEN '30代' Enter -> ELSE 'その他' Enter -> END 'Generation' Enter -> FROM tbl_Customer; Enter +------+------------+ | Age | Generation | +------+------------+ | 21 | 20代 | | 30 | 30代 | | 45 | その他 | | 18 | 10代 | | 21 | 20代 | | 22 | 20代 | | 35 | 30代 | +------+------------+ 7 rows in set (0.00 sec)
このページで使用しているサンプルデータ
unknown
サンプルデータ
# テーブル(tbl_Customer)作成 CREATE TABLE tbl_Customer( UserID VARCHAR(4) NOT NULL PRIMARY KEY, FirstName VARCHAR(32) NOT NULL, LastName VARCHAR(32) NOT NULL, Sex CHAR(2) DEFAULT NULL, Age INTEGER DEFAULT NULL ); # データ挿入 INSERT INTO tbl_Customer (UserID,FirstName,LastName,Sex,Age) VALUES ('U001','花子','鈴木','f',21), ('U002','太郎','田中','m',30), ('U003','一郎','鈴木','m',45), ('U004','萌子','山口','f',18), ('U005','愛','森永','f',21), ('U006','太郎','鈴木','m',22), ('U007','花子','佐藤','f',35);