0. 実験ユーザー「dicdic」でコネクトする。
SQL> conn dicdic/Oracle11g
接続されました。
SQL>
|
1. 【CASE文】
Select文の中に、CASE文もどきを挿入することができる。
SQL> Select 氏名,性別,CASE 性別 When 1 Then 'おんな' When 2 Then 'おとこ' END from TT01_学生 Where rownum < 10;
氏名 性別 CASE性
---------------------------------------- ---------- ------
小室 綾乃 1 おんな
浜野 響 1 おんな
宮野 雄二郎 2 おとこ
大西 勝美 1 おんな
畠山 更紗 1 おんな
五島 未羽 1 おんな
迫田 幸三郎 2 おとこ
田川 幸雄 2 おとこ
松沢 幸夫 2 おとこ
9行が選択されました。
SQL>
|
2. CASE文の中に出現パターンが網羅できていない場合、NULLが返される。
SQL> Select 氏名,血液型,CASE 血液型 When 1 Then 'A型' When 2 Then 'B型' END from TT01_学生 Where rownum < 13;
氏名 血液型 CAS
---------------------------------------- ---------- ---
小室 綾乃 3
浜野 響 1 A型
宮野 雄二郎 4
大西 勝美 1 A型
畠山 更紗 1 A型
五島 未羽 2 B型
迫田 幸三郎 1 A型
田川 幸雄 2 B型
松沢 幸夫 2 B型
福原 和男 1 A型
植木 誠司 3
長田 信彦 4
12行が選択されました。
SQL>
|
3. 血液型なら全パターンを網羅してCASE文に列挙することは可能だが、そうはいかない場合もある。
しかしNullが返ってきてはカッコ悪いので代替文字を表示できる。ELSEが使えるのだ。
O型とAB型の人には失礼だが、たとえばの例として下のような書き方をする。
SQL> Select 氏名,血液型,CASE 血液型 When 1 Then 'A型' When 2 Then 'B型' else 'その他' END from TT01_学生 Where rownum < 13;
氏名 血液型 CASE血
---------------------------------------- ---------- ------
小室 綾乃 3 その他
浜野 響 1 A型
宮野 雄二郎 4 その他
大西 勝美 1 A型
畠山 更紗 1 A型
五島 未羽 2 B型
迫田 幸三郎 1 A型
田川 幸雄 2 B型
松沢 幸夫 2 B型
福原 和男 1 A型
植木 誠司 3 その他
長田 信彦 4 その他
12行が選択されました。
SQL>
|
4. 【DECODE関数】
CASE文と同じような役割を果たす関数としてDECODE関数というのがある。
CASE文と比較して、とてもシンプルで便利だが、引数が延々と続くと、ワケがわからなくなる可能性があるので注意。
SQL> Select 氏名,血液型,DECODE(血液型,1,'A型',2,'B型') from TT01_学生 Where rownum < 13;
氏名 血液型 DEC
---------------------------------------- ---------- ---
小室 綾乃 3
浜野 響 1 A型
宮野 雄二郎 4
大西 勝美 1 A型
畠山 更紗 1 A型
五島 未羽 2 B型
迫田 幸三郎 1 A型
田川 幸雄 2 B型
松沢 幸夫 2 B型
福原 和男 1 A型
植木 誠司 3
長田 信彦 4
12行が選択されました。
SQL>
|
5. DECODE関数の場合、elseケースは、引数の最後になる。何でもかんでも引数に盛り込んでいる感があり、ややこしいが。
SQL> Select 氏名,血液型,DECODE(血液型,1,'A型',2,'B型','その他') from TT01_学生 Where rownum < 13;
氏名 血液型 DECODE
---------------------------------------- ---------- ------
小室 綾乃 3 その他
浜野 響 1 A型
宮野 雄二郎 4 その他
大西 勝美 1 A型
畠山 更紗 1 A型
五島 未羽 2 B型
迫田 幸三郎 1 A型
田川 幸雄 2 B型
松沢 幸夫 2 B型
福原 和男 1 A型
植木 誠司 3 その他
長田 信彦 4 その他
12行が選択されました。
SQL>
|
|