mysqlテクニックのnull値マッピング(IFとIFNULL)を他の意味のある値に


データベース関係モデルの作成者であるE.F.Codd博士は関係データベース理論にNULL概念を導入した.Dr.E.C.F.Coddの記述によれば、NULLは未知の値または欠落した情報を表す.ここでmysqlはまた、NULLが情報の欠如または不適用を示す概念をサポートする.したがって、データベース・テーブルには、NULLの値を含むデータが格納される可能性があります.しかし、レポート形式でユーザにデータを提示する場合、NULLの値を表示することは意味がありません.したがって、レポートをより読み取りやすく理解できるようにするには、未知、欠落、使用不可(N/A)などの他の意味のある値としてNULL値を表示する必要があります.これを行うには、IF関数を使用します.文法構造を見てみましょう.
IF(exp,exp_result1,exp_result2);

上記の式では、expの計算結果がTRUE(exp <> 0およびexp <> NULL)の場合、IF関数はexp_result1の値を返し、そうでなければexp_result2の値を返します.実際には、IF関数の戻り値は、exp_result1式およびexp_result2式に応じて文字列または数値であってもよい.用事が終わったらsqlを書いて、このIFの効果を感じましょう.customers表に含まれるcustomernamestateおよびcountryのデータの一部を以下に示します.
SELECT 
    customername, state, country
FROM
    customers
ORDER BY country;

上記のコードを実行すると、次の結果が得られます.
+------------------------------------+---------------+--------------+
| customername                       | state         | country      |
+------------------------------------+---------------+--------------+
| Australian Collectors, Co.         | Victoria      | Australia    |
| Annas Decorations, Ltd             | NSW           | Australia    |
| Souveniers And Things Co.          | NSW           | Australia    |
| Australian Gift Network, Co        | Queensland    | Australia    |
|**************      many many   *********************************|
| Handji Gifts& Co                   | NULL          | Singapore    |
| Asian Shopping Network, Co         | NULL          | Singapore    |
| SAR Distributors, Co               | Pretoria      | South Africa |
| Euro+ Shopping Channel             | NULL          | Spain        |
| Diecast Collectables               | MA            | USA          |
+------------------------------------+---------------+--------------+
122 rows in set

上記の結果セットから、state列の値が一部の顧客に適用されないことがわかります.IF関数を使用して、NULL値をN/Aとして表示します.sqlを見てみましょう.
SELECT 
    customername, IF(state IS NULL, 'N/A', state) state, country
FROM
    customers
ORDER BY country;

上のクエリ・コードを実行すると、次の結果が得られます.
+------------------------------------+---------------+--------------+
| customername                       | state         | country      |
+------------------------------------+---------------+--------------+
| Australian Collectors, Co.         | Victoria      | Australia    |
| Annas Decorations, Ltd             | NSW           | Australia    |
| Souveniers And Things Co.          | NSW           | Australia    |
| Australian Gift Network, Co        | Queensland    | Australia    |
| Australian Collectables, Ltd       | Victoria      | Australia    |
| Salzburg Collectables              | N/A           | Austria      |
| Mini Auto Werke                    | N/A           | Austria      |
| Petit Auto                         | N/A           | Belgium      |
| Royale Belge                       | N/A           | Belgium      |
|**************            *********************************|
| Motor Mint Distributors Inc.       | PA            | USA          |
| Signal Collectibles Ltd.           | CA            | USA          |
| Diecast Collectables               | MA            | USA          |
+------------------------------------+---------------+--------------+
122 rows in set

正直に言うと、mysqlはIF関数のほかにIFNULL関数を提供し、NULL値を直接処理することができます.IFNULL関数の構文は次のとおりです.
IFNULL(exp,exp_result);

sqlを書き直します.
SELECT customername, 
       IFNULL(state,"N/A") state, 
       country
FROM customers
ORDER BY country;

上記のsqlでは、expの計算結果がNULLの値である場合、IFNULL関数はexp_result式の値を返し、そうでない場合はexp式の値を返します.
ここでは、IFおよびIFNULL関数を使用して、NULL値を他のより意味のある値にマッピングし、データを読み取り可能に表示するための小さなテクニックを共有します.いい感じだったら、応援よろしくね..