NULL を処理する
NULL 値は、"値なし" または"不明" を意味します。 これは、0 または空白、さらには空の文字列を意味するものではありません。 これらの値は不明ではありません。 NULL 値は、顧客がまだ電子メール アドレスを提供していない場合など、まだ提供されていない値に使用できます。 また、前に説明したとおり、NULL 値は、値がターゲットのデータ型と互換性がない場合に一部の変換関数によって返される値でもあります。
多くの場合、NULL を処理するには特別な手順が必要です。 NULL は、実際には非値であり、 不明です。 これと等しいものはなく、等しくないものもありません。 NULL よりも大きいまたは小さいものはありません。 NULL 値が何であるかを説明できなくても、これを使用することが必要な場合があります。 ありがたいことに、T-SQL には、NULL 値の変換または置換のための関数が用意されています。
ISNULL
ISNULL 関数は 2 つの引数を取ります。 1 つ目は、テストする式です。 その最初の引数の値が NULL のとき、この関数は 2 番目の引数を返します。 最初の式が NULL ではない場合、これは変更されずに返されます。
たとえば、データベースの Sales.Customer テーブルに NULL 値を許可する MiddleName 列が含まれているとします。 このテーブルに対してクエリを実行する場合、結果で NULL を返すのではなく、"なし" などの特定の値を返すことを選択できます。
SELECT FirstName,
ISNULL(MiddleName, 'None') AS MiddleIfAny,
LastName
FROM Sales.Customer;
このクエリの結果は次のようになります。
FirstName
MiddleIfAny
LastName
Orlando
北
Gee
Keith
なし
Howard
Donna
F.
Gonzales
...
...
...
Note
NULL の代わりに使用される値は、評価される式と同じデータ型である必要があります。 上記の例では、MiddleName は varchar であるため、置換値を数値にすることはできません。 さらに、データに通常の値として表示されない値を選択する必要があります。 データに表示されない値を見つけるのが難しい場合があります。
前の例では、ソース テーブル内の NULL 値を処理しましたが、ISNULL 関数内に TRY_CONVERT 関数をネストするなど、NULL を返す可能性のある任意の式で ISNULL を使用できます。
COALESCE
ISNULL 関数は ANSI 標準ではないため、代わりに COALESCE 関数を使用することができます。 COALESCE は、それぞれが式である可変個の引数を取ることができるため、もう少し柔軟性があります。 これは、リスト内の NULL ではない最初の式を返します。
引数が 2 つしかない場合、COALESCE は ISNULL と同様に動作します。 ただし、引数が 3 つ以上ある場合は、ISNULL を使用したマルチパート CASE 式の代わりに COALESCE を使用できます。
すべての引数が NULL の場合、COALESCE は NULL を返します。 すべての式は、同じまたは互換性のあるデータ型を返す必要があります。
構文は次のとおりです。
SELECT COALESCE ( expression1, expression2, [ ,...n ] )
次の例では、HR.Wages という架空のテーブルを使用しています。このテーブルには、従業員の週あたり賃金に関する情報を含む 3 つの列 (時給、週給、販売単位あたりの歩合) が含まれています。 ただし、1 人の従業員が受け取る給与の種類は 1 つだけです。 各従業員について、これら 3 つの列の 1 つに値が含まれ、他の 2 つは NULL になります。 各従業員に支払われる合計金額を決定するには、COALESCE を使用して、これら 3 つの列にある NULL 以外の値のみを返すことができます。
SELECT EmployeeID,
COALESCE(HourlyRate * 40,
WeeklySalary,
Commission * SalesQty) AS WeeklyEarnings
FROM HR.Wages;
結果は次のようになります。
EmployeeID
WeeklyEarnings
1
899.76
2
1001.00
3
1298.77
...
...
NULLIF
NULLIF 関数を使用すると、特定の条件下で NULL を返すことができます。 この関数には、空白またはプレースホルダー文字を NULL に置き換える必要がある場合に、データ クレンジングなどの領域で役立つアプリケーションがあります。
NULLIF は 2 つの引数を取り、それらが同等である場合は NULL を返します。 それらが等しくない場合、NULLIF は最初の引数を返します。
次の例の NULLIF は、0 の割引を NULL に置き換えます。 0 でない場合、割引値を返します。
SELECT SalesOrderID,
ProductID,
UnitPrice,
NULLIF(UnitPriceDiscount, 0) AS Discount
FROM Sales.SalesOrderDetail;
結果は次のようになります。
SalesOrderID
ProductID
UnitPrice
Discount
71774
836
356.898
NULL
71780
988
112.998
0.4
71781
748
818.7
NULL
71781
985
112.998
0.4
...
...
...
...