2017-03-08 84 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'; 

..這返回一行空白。

但是,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; 

這是bug還是有一些原因,前者沒有工作?

回答

3

case i.cd_ver when NULL ...是邏輯上等同於case when i.cd_ver = NULL ...你清楚地知道,在UNKNOWN這樣的比較結果,而不是真正的,所以case表達落空至默認值,這是NULL。 (要爲自己測試,end前加else 'x'並再次運行它,你會看到。)

正確的方式來寫它是case when i.cd_ver is null then '9' when i.cd_ver = '0' then '10' end

0

嘗試查看空的(「」)值或is NULL

+0

我做到了,那也沒用。 – user3224907

+0

更新爲IS NULL – NikNik

+1

@ user3224907 - 在Oracle中與NULL相同。 (SQL標準不兼容的......在他們的防守,約「」和NULL甲骨文的事情是之前有一個標準出臺。) – mathguy

2

'simple' case expression的形式將此處的值 - i.cd_ver與每個比較表達式進行比較,尋找一個相等的值。

在簡單的情況下表達,對於第一Oracle數據庫搜索時... THEN配對爲其EXPR等於comparison_expr並返回RETURN_EXPR ...

的重要的是「expr等於 ......」。由於nothing is ever equal to null, even itself,沒有匹配。

爲了尋找空,你需要搜索的情況下,p21蛋白表達,而不是:

  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

我不會這麼認爲,案例更加緊湊,但你會做同樣的邏輯比較和評估。我認爲我從來沒有做過全面的測試,但是如果你認爲可能有一個顯着的影響,那麼比較它們就相當簡單。 –

+2

CASE表達式的一個好處是代碼可以更容易地「複製」到SQL代碼中。我們不知道OP如何使用它,但完全有可能他首先不需要PL/SQL;如果代碼要用純SQL重寫,則可以複製和粘貼CASE表達式; IF-THEN-ELSIF-THEN -...- END IF將不得不被重寫。 – mathguy