【问题标题】:Why is my null check not working in this IF statement in Oracle?为什么我的空检查在 Oracle 的这个 IF 语句中不起作用?
【发布时间】:2020-06-23 00:14:49
【问题描述】:

这应该是一个简单的问题。我想要一个特定的列 claimby 在用户 ID 和任何内容之间交替。所以,我正在编写一个简单的程序,它应该查看该列以查看用户 ID 是否在其中。如果是,请将其设置为空。如果没有,则将其设置为用户 ID。这就是我所需要的。但是,我在确定该列是否为空时遇到了困难。我正在尝试各种方法,例如 1) case claimby when null,2) case claimby when '',3) if length(claimedby)

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 的列未设置为“闪耀”。我已经确认程序中的claim_by变量与claimby列的结构相匹配,即varchar2(10);

我认为也许 IF 语句可能会相互抵消。所以,我注释掉了所有的 ELSE 子句并再次尝试。它仍然为空,证明这些 IF 语句都不起作用。

这一定很简单。我错过了什么?谢谢。

【问题讨论】:

  • 除了我的答案,试试这个:select length(null) from dual;如果你不理解输出,请查找 length 的文档乙>。然后想想条件 null ;这是什么时候真的

标签: oracle if-statement null case varchar2


【解决方案1】:

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

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

现在回答你的问题。您正在使用简单的表格。它的意思相当于case when claimed_by = null then .....你能看出这里的问题吗?如果您不能,请再次阅读有关 null 的内容,以及何时 (anything) 曾经等于null

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

【讨论】:

  • 太棒了,mathguy!那工作得很好。我昨天花了四个小时搜索 Oracle 文档,但无法正常工作。感谢您找到我丢失的小东西。你是一个伟大的福尔摩斯! 8-D
猜你喜欢
  • 2021-11-19
  • 1970-01-01
  • 1970-01-01
  • 2018-03-02
  • 2014-02-23
  • 1970-01-01
  • 1970-01-01
  • 2012-07-21
  • 1970-01-01
相关资源
最近更新 更多