2017-03-08 79 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