条件式
では、最後にCASE
式とDECODE
に関する問題です。
問4
次の2つのSQLを確認してください。
(1) SELECT ename, CASE WHEN sal >= (SELECT MAX(sal) FROM emp) THEN 'High' ELSE 'Low' END SAL_MARK FROM emp WHERE deptno = 10;
(2) SELECT ename, DECODE(sal,(SELECT MAX(sal) FROM emp), 'High','Low') FROM emp WHERE deptno = 10;
正しいものを1つ選びなさい。
- a. 2つともエラーになる
- b. (1)だけエラーになる
- c. (2)だけエラーになる
- d. 2つとも結果を戻す
関数からの出題というより、まるで副問合せからの出題のようです。要するに「12c SQL試験には高度なSQLも出題されますよ」ってことです。関数がいろんなカテゴリに登場するように、副問合せもいろんなカテゴリに登場するような気がします。
単一列単一行副問合せは、実行結果として1つの値しか戻さないので「値」の代わりになります。つまり、「値」を記述できるところなら、単一列単一行副問合せを使用できるんだと覚えておけばよいでしょう。副問合せは、別な機会に改めて解説しますね。
設問の(1)はCASE
式です。THEN
の後には、式または値を指定します。
CASE式には、CASE
の直後に列名を指定し、WHEN
の直後に条件値だけを記述する「単純CASE式」と、CASE
の直後に列名は記述せずに、WHEN
の直後に列名 比較演算子 条件値
を記述する「検索CASE式」があります。WHEN
に続く比較条件は非等価条件(=
以外の演算子)でも構いません。
設問の(2)のDECODE
は、複数の条件値と等価条件で比較し、結果を戻します。図6のCASE
式と同じ使い方だと思えばいいです。
設問の(1)と(2)は次の実行結果のとおり、2つとも結果を返します(正解は選択肢d)。
SQL> --設問(1) SQL> SELECT ename, 2 CASE WHEN sal >= (SELECT MAX(sal) FROM emp) 3 THEN 'High' 4 ELSE 'Low' 5 END SAL_MARK 6 FROM emp 7 WHERE deptno = 10; ENAME SAL_ ---------- ---- CLARK Low KING High MILLER Low SQL> --設問(2) SQL> SELECT ename, 2 DECODE(sal,(SELECT MAX(sal) FROM emp), 3 'High','Low') 4 FROM emp 5 WHERE deptno = 10; ENAME DECO ---------- ---- CLARK Low KING High MILLER Low
いかがでしたか? 12c SQL試験が難しいと言われる一端を見た気がしませんか。「SQLなんて、簡単だろう」と、とりあってくれない先輩に、今回の設問を一緒に解いてもらってみてはいかがでしょう。きっと、合格した暁には、おごってくれないまでも称賛してもらえるのではないでしょうか。