SQL Serverののisnullの構文、case式の置き換えや、主要DBMSの関数での置き換えについてまとめています。
ISNULL関数の構文
SQL Serverのisnull関数は、第一引数の式がNULLの場合に、第二引数の値を返します。構文は以下の通り。
ISNULL ( check_expression , replacement_value )
以下は、ProductionデータベースのProductテーブルからWeight(重量)の平均を算出するSQLです。WeightがNULLの場合は、isnull関数により50として計算します。
USE AdventureWorks2012; GO SELECT AVG(ISNULL(Weight, 50)) FROM Production.Product; GO
実行するとこうなります。
-------------------------- 59.79 (1 row(s) affected)
参考)ISNULL (Transact-SQL) – SQL Server | Microsoft Docs
ISNULL関数とIS NULL演算子の違い
ISNULL関数とIS NULL演算子は全くの別物です。以下はISNULL関数により、MaxQtyカラムがNULLのときに0.00を代替値として使う例。
USE AdventureWorks2012; GO SELECT Description, DiscountPct, MinQty, ISNULL(MaxQty, 0.00) AS 'Max Quantity' FROM Sales.SpecialOffer; GO
下記は、WeightがNULLのデータを抽出するSQLになります。
USE AdventureWorks2012; GO SELECT Name, Weight FROM Production.Product WHERE Weight IS NULL; GO
isnull関数はSQL Serverの独自関数ですが、IS NULL演算子は標準SQLです。以下は、MySQLの例です。employees_copyテーブルから、first_nameカラムがNULLのもののみを抽出しています。
mysql> select * from employees_copy limit 10; +--------+------------+--------------+-----------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+--------------+-----------+--------+------------+ | 10001 | 1953-09-02 | NULL | Facello | M | 1986-06-26 | | 10002 | 1964-06-02 | | Simmel | F | 1985-11-21 | | 10003 | 1959-12-03 | | Bamford | M | 1986-08-28 | | 10004 | 1954-05-01 | Chirstian | Koblick | M | 1986-12-01 | | 10005 | 1955-01-21 | NULL | Maliniak | M | 1989-09-12 | | 10006 | 1953-04-20 | Anneke | Preusig | F | 1989-06-02 | | 10007 | 1957-05-23 | Tzvetan | Zielinski | F | 1989-02-10 | | 10008 | 1958-02-19 | Saniya | Kalloufi | M | 1994-09-15 | | 10009 | 1952-04-19 | Sumant | Peac | F | 1985-02-18 | | 10010 | 1963-06-01 | Duangkaew | Piveteau | F | 1989-08-24 | +--------+------------+--------------+-----------+--------+------------+ 10 rows in set (0.00 sec) mysql> select * from employees_copy where first_name is null; +--------+------------+------------+-----------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-----------+--------+------------+ | 10001 | 1953-09-02 | NULL | Facello | M | 1986-06-26 | | 10005 | 1955-01-21 | NULL | Maliniak | M | 1989-09-12 | +--------+------------+------------+-----------+--------+------------+ 2 rows in set (0.14 sec)
ISNULL関数は、case式で置き換えられる
SQL ServerのISNULL関数はcase式で置き換えが可能です。以下は、first_nameカラムがNULLの場合、代替値としてNO NAMEを返す例です。
mysql> select case when first_name IS NULL then 'NO NAME' else first_name end as first_name from employees_copy limit 10; +--------------+ | first_name | +--------------+ | NO NAME | | | | | | Chirstian | | NO NAME | | Anneke | | Tzvetan | | Saniya | | Sumant | | Duangkaew | +--------------+ 10 rows in set (0.00 sec)
【関連記事】
▶SQL isnullの使い方 NULL判定やNULL置換の方法 case式でも対応可能
case式で置き換えたときの欠点は、記述が長くなり可読性が落ちる点です。
主要データベースにはcase式での置き換え以外に、NVL(Oracle)や、coalesce(MySQLなど)のNULLの代替値を返す関数が用意されているので、そちらを使うことも検討してみると良いでしょう。
▶【ハンズオン】SQLのNVL関数とは?概要や使い方を丁寧に説明!
coalesce関数は、Oracle、SQL Server、MySQL、PostgreSQLで使用可能な関数で、複数の代替値を指定可能です。代替値がNULLだった場合は、次の代替値をチェックし、NULLでない値を返します。
【関連記事】
▶SQL coalesce 値がNULLの場合の代替値を返す 簡易版のNVLやNULLIFが使えるDBもあり
まとめ
- ISNULL関数は、SQL ServerでNULLの代替値を返す関数
- ISNULL関数はcase式で置き換えが可能
- 主要データベースには、ISNULL関数と同等の機能を持つNVLやcoalesc関数が用意されている