SQLでデータを操作する際、NULL値に対して特定の処理を行うことが重要です。CASE文を用いることで、NULLの条件を指定して柔軟なデータ操作が可能になります。本記事では、SQLのCASE文を使ってNULL値を処理する方法を具体例とともに解説します。
CASE文の基本構造
CASE文は、指定した条件に応じて異なる結果を返すことができるSQLの式です。文の実行順を制御するIF文そのものではありません。基本的な構文は以下の通りです。
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
...
ELSE resultN
ENDこの構文では、各条件conditionが満たされた場合に対応する結果resultを返します。どの条件も満たされない場合は、ELSE句の結果が返されます。CASE文を使うことで、複雑な条件分岐をSQLクエリ内で実現できます。
NULL値を指定する方法
NULL値を条件として指定する場合、条件式でIS NULLを使用します。NULL値は特定のデータが存在しないことを示すため、これを判別することが重要です。以下は文字列型の列column_nameを想定した例です。数値型の列にそのまま文字列を混ぜると、DBMSの型変換規則によってエラーになることがあります。
CASE
WHEN column_name IS NULL THEN 'Value if NULL'
ELSE column_name
ENDこの構文では、column_nameがNULLである場合に'Value if NULL'を返し、それ以外の場合にはcolumn_nameの値をそのまま返します。この方法を使用すると、NULL値を適切に処理することができます。
実例1:NULL値を別の値として表示する
顧客データベースで、顧客のメールアドレスがNULLの場合にデフォルトのメールアドレスを設定する例を示します。これはSELECT結果の表示を変える例で、保存済みデータやテーブルのDEFAULT制約は変更しません。例のアドレスを実際の送信先として使用しないでください。
SELECT
customer_id,
customer_name,
CASE
WHEN email IS NULL THEN '[email protected]'
ELSE email
END AS email_address
FROM
customers;このクエリでは、customersテーブルから顧客ID、顧客名、およびメールアドレスを選択しています。メールアドレスがNULLの場合には、'[email protected]'が返され、NULLでない場合には元のメールアドレスが返されます。この方法を使用することで、NULL値の表示を統一できます。空文字や空白はNULLとは別なので、必要なら別条件で扱います。
実例2:NULL値に基づいて異なる処理を行う
次はSQL Server向けの表示例です。CASEのTHENとELSEが返す型を文字列にそろえ、変換先の長さを明示します。例えば、売上データベースで売上金額がNULLの場合には「未入力」と表示し、それ以外の場合には売上金額を表示する場合です。
SELECT
sale_id,
product_name,
CASE
WHEN sale_amount IS NULL THEN N'未入力'
ELSE CAST(sale_amount AS nvarchar(50))
END AS sale_status
FROM
sales;このクエリでは、salesテーブルから販売ID、商品名、および売上状況を選択しています。sale_amountがNULLの場合には「未入力」と表示され、NULLでない場合には売上金額が文字列として表示されます。この方法により、NULL値に対して適切な処理を行い、データの可読性を向上させることができます。
まとめ
SQLのCASE文を使用してNULL値を扱う方法について解説しました。NULL値を条件に指定する際にはIS NULLを使用し、適切なデフォルト値を設定したり、異なる処理を行うことが可能です。これにより、データの一貫性と可読性を保ちながら柔軟なデータ操作が実現できます。データベース操作においてCASE文を活用することで、より高度なクエリを作成するスキルを向上させましょう。
nvarchar(50)の長さは例です。実データの最大桁数や表示形式に合わせ、切り捨てがないことを確認してください。この構文を全DBMS共通とは扱わず、別製品ではその製品のCAST構文・文字列型へ置き換えます。
NULL判定は検索CASEのWHEN 列 IS NULLを使います。通常の等価比較を行うCASE 列 WHEN NULLや、列 = NULLでは意図した判定になりません。ELSEを省略してどの条件にも一致しなければ、結果はNULLになります。
参考:SQL ServerのCASEと戻り値の型、文字列型と長さ省略時の扱い。サンプルは説明用で、利用環境での実行結果を保証するものではありません。


コメント