Oracleで条件をわけるには通常WHERE句を使用しますが、SELECT句の「DECODE」や「CASE」でも条件をわけることができます。
今回は「DECODE」を取り上げます。
条件をわけるDECODEの使い方
DECODEの構文
--DECODEで条件をわけてSELECTする SELECT DECODE(列名, 値1, 結果1, 値2, 結果2, 結果3) FROM table1;
「DECODE」では、指定した列の値によって異なる結果を返すことができます。
- 値1 →結果1
- 値2 →結果2
- それ以外 →結果3
値で分岐した結果を返します。「値」で分岐するため、「式」での判定は使えません。式を使うには「CASE」が便利です。
例1. DECODEで条件分岐するパターン
--DECODEで学級委員・書記だけマークする SELECT s_no, DECODE(reader_f, 1, s_name || '/学級委員', 2, s_name || '/書記', s_name) FROM student;
このDECODEでは学級委員(reader_f=1)の名前に「/学級委員」をつけて、書記(reader_f=2)の名前に「/書記」をつけて、それ以外の人は名前をそのままSELECTしています。
- reader_f = 1 → s_name || ‘/学級委員’
- reader_f = 2 → s_name || ‘/書記’
- それ以外 → s_name
例2.DECODEで条件分岐するパターン(NULL)
--DECODEで学級委員・書記だけマークする SELECT s_no, DECODE(reader_f, NULL, '入力忘れ', s_name) FROM student;
ここでは「DECODE」を使って「NULL」を判定しました。
「NULL」のレコードに対してコメント「入力忘れ」をつけました。「DECODE」ではNULLもそのまま「NULL」として使用できます。
- reader_f = NULL → ‘入力忘れ’
- それ以外 → s_name
DECODEの問題点
「DECODE」には一つ大きな問題点があります。「DECODE」は「式」が使えません。なので大小比較やワイルドカードも使えません。
「DECODE」と同じことが「CASE」でもできます。「CASE」の方が式・ワイルドカードに対応しており柔軟性が高いため、CASE式を使うことをおススメします。
汎用性の低い「DECODE」は使用する機会は少ないかもしれません。
以上、OracleのDECODEの使い方とパターンでした。
コメント