トップ > SQL入門 > 14章
14章 単一行関数のネストと条件式
単一行関数はいかがでしたでしょうか。
多すぎて大変でしたね。まぁ初めて使うものは覚えることがたくさんありますので、
頑張っていきましょう。

今回は関数のネストとCASE,DECODEについて学んでいきます。
ネストとは関数を入れ子にして、複数の関数で処理を行うことを言います。

  SQL> SELECT substr(upper(first_name),1,3) FROM employees;

  SUBSTR
  ------
  SUZ
  SAT
  YAM
  …

  20 rows selected.


ネストを行った場合、内側の関数から処理されます。上記実行例では最初にupper関数にて、first_nameを大文字に変換し、
substr関数で1文字目から3文字分を取り出します。

  SQL> SELECT concat(substr(upper(first_name),1,3),substr(upper(last_name),1,3))
    2  FROM   employees;

  CONCAT(SUBST
  ------------
  SUZHIR
  SATTAK
  YAMKEI
  …

  20 rows selected.


上記は少し難しい実行例となりますが、先ほどの実行結果とconcat関数を使用して、
first_nameとlast_nameをくっつけて表示しています。

ちなみに単一行関数のネストの制限はないのでいくつでもネストすることができます。

では、次にCASE式についてのご紹介となります。CASE式は複数条件を指定し、
その条件ごとの処理を行うことができます。

構文は以下の通りです。

[構文] CASE式
CASE
 WHEN 条件式1 THEN 値
 WHEN 条件式2 THEN 値
 WHEN 条件式3 THEN 値
 …
 ELSE デフォルト値
END

CASE式を指定すると複数の条件式を記載することができます。
条件式はWHERE句で使用できる比較演算子を使用できます。

各条件式を設定し、その条件に合う行ごとにTHEN以降の処理を行うことができます。
では実行例を見ていきましょう。

  SQL> SELECT first_name,salary,
    2         CASE
    3           WHEN salary < 4000000 THEN salary*1.2
    4           WHEN salary BETWEEN 4000000 AND 6000000 THEN salary*1.5
    5           WHEN salary > 6000000 THEN salary*2
    6         END AS SHOYO
    7  FROM employees;


  FIRST_NAME                         SALARY      SHOYO
  ------------------------------ ---------- ----------
  Suzuki                           10000000   20000000
  Sato                              8000000   16000000
  Yamamoto                          5000000    7500000
  Watanabe                          6000000    9000000
  Watanabe                          5500000    8250000
  Kataoka                           6500000   13000000
  Harada                            6200000   12400000
  Koda                              6400000   12800000
  Saito                             6700000   13400000
  Akagi                             6400000   12800000
  Sato                              5400000    8100000
  Tao                               5400000    8100000
  Kaneko                            5400000    8100000
  Totsuka                           5400000    8100000
  Kato                              6500000   13000000
  Sinagawa                          6500000   13000000
  Kuroda                            4000000    4800000
  Nakamura                          4000000    4800000
  Kamata                            4000000    4800000
  Ito

  20 rows selected.


今回の例では、年収が400万より少ない場合は年収の1.2倍、
400万から600万の間の従業員は1.5倍、
600万より多い場合は、年収の2倍を計算しています。

このように複数条件で処理を行いたい場合はCASE式が便利です。
またこのCASE式はANSI準拠であり、その他のRDBMSでも使用できますが、

Oracle独自の構文を使用してCASE式と同様の処理を行うことができます。
それがDECODE関数です。DECODE関数も使い方は同じですが指定方法が異なります。

構文は以下の通りです。

[構文] CASE式
DECODE( 列名 | 式
 条件式1, 値,
 条件式2, 値,
 条件式3, 値,
 …,
 デフォルト値
)

ちなみにDECODE関数は比較演算子はイコールしか使用できないのでご注意ください。
以下実行例です。

  SQL> SELECT first_name,salary,
    2  DECODE ( salary,
    3           4000000 , salary*1.2
    4          ,6000000 , salary*2
    5         )
    6  FROM employees;


上記の例では、salary列が40000000の場合、
1.2倍、6000000の場合は2倍で計算しています。

以上が、DECODE関数の使用方法となります。