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関数の使用方法となります。