Home実験室 − No.0054


        No.0054(SQL)
        Null値の取り扱い(NVL関数、NVL2関数)

■環境
  □OS: Windows XP Professional SP3
  □Oracle: Oracle Database 11g R2 (Standard)
  □OSログインユーザ: ORA_DBAグループ
  □Oracleユーザ: dicdic(実験用ユーザー) → 実験環境構築スクリプト

■実験
  0. 実験ユーザー「dicdic」でコネクトする。

SQL> conn dicdic/Oracle11g 接続されました。 SQL>



  1. NULLは一覧表示をしたときに歯抜けのようになって表示されてしまう。
     下は休学者(在籍区分コード='06')のTOEIC得点の状況の一覧をSelectしたもの。

SQL> Select 氏名,TOEIC FROM TT01_学生 Where 在籍区分コード = '06'; 氏名 TOEIC ---------------------------------------- ---------- 多田 長次郎 蛭田 花音 789 内山 菜々美 902 細井 尚志 797 大江 常吉 585 石崎 健吉 895 岸田 雅美 718 相馬 弘之 764 下川 里沙 777 樺山 正嗣 668 大槻 安子 井沢 比呂 804 神山 道雄 719 北田 怜子 601 寺崎 範明 820 久米 安雄 588 織田 敏彦 542 飛田 幸男 18行が選択されました。 SQL>



  2. 【NVL関数】
     NVL関数は、第1引数に指定した値がNULLかどうかを判別し、NULLだった場合にのみ、第2引数に用意した値を返す。
     NULLの代替として0と表示させるようにすると、下のようになる。

SQL> Select 氏名,NVL(TOEIC,0) FROM TT01_学生 Where 在籍区分コード = '06'; 氏名 NVL(TOEIC,0) ---------------------------------------- ------------ 多田 長次郎 0 蛭田 花音 789 内山 菜々美 902 細井 尚志 797 大江 常吉 585 石崎 健吉 895 岸田 雅美 718 相馬 弘之 764 下川 里沙 777 樺山 正嗣 668 大槻 安子 0 井沢 比呂 804 神山 道雄 719 北田 怜子 601 寺崎 範明 820 久米 安雄 588 織田 敏彦 542 飛田 幸男 0 18行が選択されました。 SQL>



  3. いやまてよ...。上のようだと、まるでTOEICを受験したにもかかわらず、0点だったように見えてしまう。
     というわけで、0ではなくて「未受験」と表示させるようにしようとしたが、TOEIC列は数値(NUMBER型)なので、
     「未受験」という日本語を並列で表示することができないため下のようになってしまう。

SQL> Select 氏名,NVL(TOEIC,'未受験') FROM TT01_学生 Where 在籍区分コード = '06'; Select 氏名,NVL(TOEIC,'未受験') FROM TT01_学生 Where 在籍区分コード = '06' * 行1でエラーが発生しました。: ORA-01722: 数値が無効です。 SQL>



  4. ならば、TO_CHAR関数で文字型に変換してしまおう。
     そしたらうまくいきました。 ※数字が左詰になってしまう点に注意。

SQL> Select 氏名,NVL(TO_CHAR(TOEIC),'未受験') FROM TT01_学生 Where 在籍区分コード = '06'; 氏名 NVL(TO_CHAR(TOEIC),'未受験') ---------------------------------------- ---------------------------------------- 多田 長次郎 未受験 蛭田 花音 789 内山 菜々美 902 細井 尚志 797 大江 常吉 585 石崎 健吉 895 岸田 雅美 718 相馬 弘之 764 下川 里沙 777 樺山 正嗣 668 大槻 安子 未受験 井沢 比呂 804 神山 道雄 719 北田 怜子 601 寺崎 範明 820 久米 安雄 588 織田 敏彦 542 飛田 幸男 未受験 18行が選択されました。 SQL>



  5. 【NVL2関数】
     ついでに言うと、NVL2関数なんていうのがある。NVL2関数は、第1引数の値がNULL以外なら第2引数を返し、NULLなら第3引数を返す。

SQL> Select 氏名,NVL2(TO_CHAR(TOEIC),'受験履歴あり','未受験') FROM TT01_学生 Where 在籍区分コード = '06'; 氏名 NVL2(TO_CHAR ---------------------------------------- ------------ 多田 長次郎 未受験 蛭田 花音 受験履歴あり 内山 菜々美 受験履歴あり 細井 尚志 受験履歴あり 大江 常吉 受験履歴あり 石崎 健吉 受験履歴あり 岸田 雅美 受験履歴あり 相馬 弘之 受験履歴あり 下川 里沙 受験履歴あり 樺山 正嗣 受験履歴あり 大槻 安子 未受験 井沢 比呂 受験履歴あり 神山 道雄 受験履歴あり 北田 怜子 受験履歴あり 寺崎 範明 受験履歴あり 久米 安雄 受験履歴あり 織田 敏彦 受験履歴あり 飛田 幸男 未受験 18行が選択されました。 SQL>





    【PR】    Oracle実験室監修  『Oracleアーキテクチャ鳥瞰図』 PDF  (Oracleのアーキテクチャを一目で俯瞰できるイラスト)  


Home実験室 − No.0054

© 2011-2011   Amateur Laboratory of ORACLE
inserted by FC2 system