2017-03-08 2 views
0

私は次のコードを持っている:OracleにCASE文があるバグ?

  IF i.cd_ver IS NULL OR i.cd_ver = '0' 
      THEN 
--Set value of v_cd_ver 
       v_cd_ver := CASE i.cd_ver 
           WHEN NULL 
           THEN '9' 
           WHEN '0' 
           THEN '10' 
          END; 
      END if; 

「i」は、外部表を基準とカーソルで見つかったレコードです。外部表の値はNULLまたは空白です。

SELECT cd_ver FROM table_xtl WHERE cd_id = '123'; 

..この1行は空白です。

ただし、v_cd_verは期待通りに'9'に設定されませんでした。私の回避策は代わりにIF THENステートメントを使用することでしたし、それは動作します。 CASEステートメントが期待どおりに機能しないのはなぜですか?

UPDATE:私が代わりにしようとしたとき には、以下のそれが働いた:

 v_cd_ver := CASE 
         WHEN i.cd_ver IS NULL 
         THEN '9' 
         WHEN i.cd_ver = '0' 
         THEN '10' 
        END; 

が、これはバグですか、前者が動作しなかった理由は、いくつかの理由がありますか? case式がデフォルトにフォールスルーして、空(「」)値またはis NULL

答えて

3

case i.cd_ver when NULL ...は、あなたがUNKNOWNではなく、TRUEで、このような比較結果という完全なよく知っているcase when i.cd_ver = NULL ...と論理的に等価であるチェックする

0

てみてください値はNULLです。 (これを自分でテストするには、endの前にelse 'x'を追加してもう一度実行してください。)

正しい書き込み方法はcase when i.cd_ver is null then '9' when i.cd_ver = '0' then '10' endです。

+0

私はそれもうまくいきませんでした。 – user3224907

+0

がIS NULL – NikNik

+1

@ user3224907で更新されました - Oracleでは 'NULL'と同じです。 (SQL標準に準拠していない...彼らの防衛の中では、「 ''についてのOracleのこと、そして標準が出る前にNULLが導入された。) – mathguy

2

この形式の'simple' case expressionは、ここで値 - i.cd_verを比較し、それぞれが等しいものを探します。最初のための単純なCASE式、Oracleデータベースの検索で

THEN exprのcomparison_exprに等しく、return_exprを返すためにペア... ...

重要なビットがあります "のためのexprと等しいです"。 nothing is ever equal to null, even itself以降、一致するものはありません。あなたが代わりに検索CASE exprssionを必要とヌルのために見に

  v_cd_ver := CASE 
          WHEN i.cd_ver IS NULL THEN '9' 
          WHEN i.cd_ver = '0' THEN '10' 
         END; 

関係ありませんが、あなたは0、9および10は、実際に文字列として扱われるべきでよろしいですか?

+0

はいの文字列。この特定のケースでCASE対IF THENの使用に違いはありますか?パフォーマンス? – user3224907

+0

私はそう思っていないでしょう。ケースはもっとコンパクトですが、同じ論理的な比較や評価をしているでしょう。私はこれまで包括的なテストを行ったことはないと思っていますが、重要なmpactがあると思ったら、それを比較するのはかなり簡単です。 –

+2

CASE式のメリットの1つは、コードをSQLコードに簡単に「コピーする」ことができることです。 OPがこれをどのように使用しているかわかりませんが、最初はPL/SQLが必要ない可能性があります。コードを単純なSQLで書き直す場合は、CASE式をコピーして貼り付けることができます。 IF-THEN-ELSIF-THEN -...-終了IFを書き直す必要があります。 – mathguy