Oracle中CASE语句的错误?

时间:2017-03-08 23:39:50

标签: oracle plsql 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语句没有按预期工作?

更新: 当我尝试以下时,它起作用了:

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

这是一个错误还是有一些原因导致前者不起作用?

3 个答案:

答案 0 :(得分:4)

case i.cd_ver when NULL ...在逻辑上等同于case when i.cd_ver = NULL ...您完全清楚这样的比较导致UNKNOWN,而不是TRUE,因此case表达式会降至默认值,即NULL。 (要自己测试一下,在else 'x'之前添加end然后重新运行,你会看到。)

正确的写作方式是case when i.cd_ver is null then '9' when i.cd_ver = '0' then '10' end

答案 1 :(得分:3)

'simple' case expression的形式将值 - i.cd_ver - 与每个比较表达式进行比较,寻找相同的值。

  

在一个简单的CASE表达式中,Oracle数据库搜索 expr 等于 comparison_expr 的第一个WHEN ... THEN对并返回 return_expr ...

重要的是" expr 等于 ..."。自nothing is ever equal to null, even itself以来,没有匹配。

要查找空值,您需要搜索案例exprssion:

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

没有关系,但你确定0,9和10应该被视为字符串吗?

答案 2 :(得分:0)

尝试检查空('')值或template <typename Device, typename T> struct DenseUpdate<Device, T, ASSIGN> { void operator()(const Device& d, typename TTypes<T>::Flat params, typename TTypes<T>::ConstFlat update) { params.device(d) = update; } };