トップ > SQL入門 > 13章
13章 単一行関数(一般関数)
では、本章では一般関数について書いていきたいと思います。

一般関数はNULLを操作する関数となります。

一般関数
NVL NULL値を別の値に変換して表示
NVL2 NULL値かどうかにより、値を変換して表示
NULLIF NULLがどうかを評価し表示
COALESCE NULLではない値を表示

NVL関数


NVL関数はNULLを別の値に変換する関数です。

  SQL> SELECT first_name,salary,NVL(salary,0) FROM employees;

  FIRST_NAME                         SALARY NVL(SALARY,0)
  ------------------------------ ---------- -------------
  Suzuki                           10000000      10000000
  Sato                              8000000       8000000
  Yamamoto                          5000000       5000000
  …
  Ito                                                   0

  20 rows selected.


NLVは第1引数に対象データを指定し、
第2引数に対象データがNULLの場合に表示したい値を指定します。
対象データがNULLでない場合は、対象データの値を表示します。

上記例は、ItoさんはsalaryがNULLのため、0が表示されています。
またSatoさんはsalaryがNULLでないため、salaryの値が表示されています。

NVL関数を使用する応用として、NULLを別の値に変換して、計算式を使用することができます。

  SQL> SELECT first_name,salary,salary*2,NVL(salary,3000000)*2
    2> FROM employees;

  FIRST_NAME              SALARY   SALARY*2 NVL(SALARY,3000000)*2
  ------------------- ---------- ---------- ---------------------
  Suzuki                10000000   20000000              20000000
  Sato                   8000000   16000000              16000000
  Yamamoto               5000000   10000000              10000000
  …
  Ito                                                     6000000

  20 rows selected.


上記例はNVL関数を使用して、SALARY列がNULLの場合、3000000に変換しています。
その値に対し、2倍の計算を行っています。
NULL値は計算式を使用しても結果はNULLでしたが、
数値に変換することにより、計算式が使用できます。

NVL2関数


続いてNVL2関数です。NVL関数はNULLの場合だけ、ほかの値に変更する関数でしたが、
NULLでない場合にも、別の値に変更することができます。

  SQL> SELECT first_name,salary,NVL2(salary,0,99999)
    2> FROM employees;

  FIRST_NAME                         SALARY NVL2(SALARY,0,99999)
  ------------------------------ ---------- --------------------
  Suzuki                           10000000                    0
  Sato                              8000000                    0
  Yamamoto                          5000000                    0
  …
  Ito                                                      99999

  20 rows selected.


上記例ではSALARYの値がNULLでない場合は0を表示し、
NULLの場合は99999を表示しています。
この様にNVL2関数はNULLの場合、
NULLでない場合の両方に値を指定することができる関数です。

NULLIF関数


続いてNULLIF関数のご紹介です。
NULLIF関数は2つの引数を比較して同じ値の場合、NULLを表示します。

  SQL> SELECT NULLIF('TEST','TEST') FROM dual;

  NULL
  ----


今回の実行例は対象データ1,2共に、TESTという値で同じ文字の為、
実行結果にNULLが表示されます。

  SQL> SELECT NULLIF('TEST','AAAA') FROM dual;

  NULL
  ----
  TEST


今回の実行例は対象データ1はTEST,対象データ2はAAAAなので、
別の値の為、対象データ1が表示されます。
このようにNULLIF関数は対象列の値がNULLかどうか判別するときに使用します。

COALESCE関数


では、最後にCOALESCE関数ですが、
この関数は複数の対象データに対しNULLかどうかを判別することができます。

対象データ1がNULLでない場合は、対象データ1を表示し、
NULLの場合は、対象データ2を参照し、NULLでない場合は、
対象データ2を表示します。
そうでない場合は、対象データ3を参照し…というようにNULLの場合は
次の対象データを参照していきます。

この関数で指定できる対象データの上限は256のようです。

  SQL> SELECT first_name,COALESCE(salary,manager_id) FROM employees;

  FIRST_NAME                     COALESCE(SALARY,MANAGER_ID)
  ------------------------------ ---------------------------
  Suzuki                                            10000000
  Sato                                               8000000
  Yamamoto                                           5000000
  …
  Ito                                                     16

  20 rows selected.


SuzukiさんはsalaryがNULLでない為、salaryが表示されていますが、
ItoさんはsalaryがNULLのため、manager_idを参照していますが、
manager_idはNULLでない為、manager_idが表示されています。

いかがでしたでしょうか。5回に渡り単一行関数を学んできました。

覚えることがたくさんありましたが、いくつの引数が必要かまで覚える必要はありません。
いつか使用するタイミングがあり、この関数が使えるかもと思い出せればそれで良いです。
今回紹介した関数もごく一部ですので、使用するタイミングがあれば、
その他の関数も調べてみると良いでしょう。