Oracle中CASE语句的Bug?

Oracle中CASE语句的Bug?,oracle,plsql,case,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'

我有以下代码:

            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\u cd\u ver
未按预期设置为
'9'
。我的解决方法是使用
IF-THEN
语句,它可以工作。为什么
案例
语句不能按预期工作

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

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

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

尝试检查空(“”)值或
为NULL
尝试检查空(“”)值或
为NULL
case i.cd\u ver when NULL…
在逻辑上等同于
case when i.cd\u ver=NULL…
您非常清楚,这样的比较结果是未知的,而不是真的,因此
case
表达式会变成默认值,即
NULL
。(要自己测试,请在
end
之前添加
else'x'
,然后再次运行,您将看到。)


正确的编写方法是
当i.cd\u ver为null时的case,然后当i.cd\u ver='0'时的'9',然后是'10'end
当i.cd\u ver为null时的case i.cd\u ver…
在逻辑上等同于
当i.cd\u ver=null时的case…
您完全知道这样的比较结果是未知的,而不是真的,因此,
大小写
表达式使用默认值,即
NULL
。(要自己测试,请在
end
之前添加
else'x'
,然后再次运行,您将看到。)

正确的编写方法是
当i.cd\u ver为null时为case,当i.cd\u ver='0'时为'9',然后为'10'end
,这种形式的将值-
i.cd\u ver
与每个比较表达式进行比较,寻找一个相等的表达式

在一个简单的CASE表达式中,Oracle数据库在以下情况下搜索第一个。。。然后,expr等于comparison_expr并返回return_expr的对

其中重要的一位是“expr等于…”。因为,没有对手

要查找空值,您需要搜索的大小写表达式:

            v_cd_ver := CASE
                            WHEN i.cd_ver IS NULL THEN '9'
                            WHEN i.cd_ver = '0' THEN '10'
                        END;
不相关,但您确定0、9和10真的应该被视为字符串吗?

这种形式的将值-
i.cd\r
与每个比较表达式进行比较,寻找一个相等的表达式

在一个简单的CASE表达式中,Oracle数据库在以下情况下搜索第一个。。。然后,expr等于comparison_expr并返回return_expr的对

其中重要的一位是“expr等于…”。因为,没有对手

要查找空值,您需要搜索的大小写表达式:

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

不相关,但您确定0、9和10真的应该被视为字符串吗?

@user3224907-在Oracle“”中与NULL相同。(不符合SQL标准…在他们的辩护中,Oracle关于“”和NULL的东西是在标准出现之前引入的。)@user3224907-在Oracle中“”与NULL相同。(不符合SQL标准……为他们辩护,Oracle关于“”和NULL的东西是在标准出现之前引入的。)是字符串。在这个特定的案例中,用例和IF-THEN有什么区别吗?性能?我不这么认为,案例更紧凑,但你会做同样的逻辑比较和评估。我不认为我做过全面的测试,但是如果你认为会有重大影响,比较它们就相当简单了。CASE表达式的一个好处是代码可以更容易地“复制”到SQL代码中。我们不知道OP是如何使用它的,但完全有可能他一开始就不需要PL/SQL;如果要用纯SQL重新编写代码,可以复制和粘贴大小写表达式;IF-THEN-ELSIF-THEN-…-END-IF必须重写。当然可以,但我只是把评论解读为关于性能的;我错过了它,因为我在寻找其他的好处…很公平。。。但是最大的性能改进可能确实来自于重写PL/SQL代码在纯SQL中所做的任何事情是的。在这个特定的案例中,用例和IF-THEN有什么区别吗?性能?我不这么认为,案例更紧凑,但你会做同样的逻辑比较和评估。我不认为我做过全面的测试,但是如果你认为会有重大影响,比较它们就相当简单了。CASE表达式的一个好处是代码可以更容易地“复制”到SQL代码中。我们不知道OP是如何使用它的,但完全有可能他一开始就不需要PL/SQL;如果要用纯SQL重新编写代码,可以复制和粘贴大小写表达式;IF-THEN-ELSIF-THEN-…-END-IF必须重写。当然可以,但我只是把评论解读为关于性能的;我错过了它,因为我在寻找其他的好处…很公平。。。但是最大的性能改进可能确实来自于重写PL/SQL代码在纯SQL中所做的任何事情