【Oracle】DECODE で条件をわける【SQL】

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の使い方とパターンでした。

コメント