为什么我的 null 检查在 Oracle 的这个 IF 语句中不起作用?

Why is my null check not working in this IF statement in Oracle?

这应该是一个简单的问题。我想要一个 claimedby 的特定列在用户 ID 和空之间交替。因此,我正在编写一个简单的过程,该过程应该查看该列以查看其中是否有用户 ID。如果是,请将其设置为空。如果什么都没有,则将其设置为用户 ID。这就是我所需要的。但是,我 运行 很难确定该列是否为空。我正在尝试各种方法,例如 1) case claimedby when null,2) case claimedby when '',3) if length(claimedby) < 1。在 none 个案例中,列被设置为传入参数userID。它始终保持为空。这是我的代码:

create or replace PROCEDURE claimprocedure
   ( userID IN varchar2, docketnum IN varchar2 )
IS
   claimed_by varchar2(10);

  cursor c1 is
    SELECT claimedby FROM DR_RULE24.CISR_INTAKE_ERRORS_MASTER 
     WHERE docket_num = docketnum;
     
BEGIN

  open c1;
  fetch c1 into claimed_by;
  close c1;

 DBMS_OUTPUT.PUT_LINE('claimed_by = ' || claimed_by);

CASE claimed_by
    when null then update DR_RULE24.cisr_intake_errors_master set claimedby = userID where docket_num = docketnum;
    when '' then update DR_RULE24.cisr_intake_errors_master set claimedby = userID where docket_num = docketnum;
    ELSE update DR_RULE24.cisr_intake_errors_master set claimedby = '' where docket_num = docketnum;
  END CASE;
  
  if length(claimed_by) < 1 then update DR_RULE24.cisr_intake_errors_master set claimedby = userID where docket_num = docketnum;
    else update DR_RULE24.cisr_intake_errors_master set claimedby = '' where docket_num = docketnum;
   end if;

  if claimed_by = '' then update DR_RULE24.cisr_intake_errors_master set claimedby = userID where docket_num = docketnum;
  else update DR_RULE24.cisr_intake_errors_master set claimedby = '' where docket_num = docketnum;
 end if;

if claimed_by is null then update DR_RULE24.cisr_intake_errors_master set claimedby = userID where docket_num = docketnum;
  else update DR_RULE24.cisr_intake_errors_master set claimedby = '' where docket_num = docketnum;
 end if;
   
END;

我确认该列设置为空,然后我调用它:

SET SERVEROUTPUT ON
call claimprocedure('shone','106712');

摘要编号 106712 的列未设置为 'shone'。我已经确认过程中的 claimed_by 变量与 claimedby 列的结构相匹配,即 varchar2(10);

我认为 IF 语句可能会相互抵消。因此,我注释掉了所有 ELSE 子句并再次尝试。它仍然是 null,证明这些 IF 语句中的 none 是有效的。

一定是简单的东西。我错过了什么?谢谢。

case 语句(及其同类 case 表达式)有两种形式:“简单”形式和“搜索”形式。

简单的形式看起来像 case <expr> when <val1> then ... when <val2> then ... else ... end - 这很简单,易于阅读,但它只适用于直接相等性检查。搜索到的表单看起来像 case when <condition1> then ... when <condition2> then ... else ... end。这里你写的代码多了一点,但是这种形式更通用。

现在回答你的问题。您正在使用简单的形式。它的意思等同于case when claimed_by = null then ..... 你能看出这里的问题吗?如果你不能,请再次阅读有关 null 的内容,当某些东西 (anything) 永远 等于 null .

您必须使用搜索到的表格,并以正确的SQL方式填写您的条件:case when claimed_by IS null then ....