检查IS NULL无法按预期工作

时间:2017-04-10 11:03:33

标签: oracle stored-procedures plsql

我写了一个SP,它根据我从前端选择的条件给出了记录。

问题在于,无论何时我选择状态为Success,它都能正常工作,并为我提供成功的结果。但是,当我选择Pending IS NULL时,它不能按要求运行。

以下是我的SP

PROCEDURE GET_ALL_STATE_FOR_EXCEL
  (
    P_STATUS NVARCHAR2,
    TBLDATA_STATE_ALL OUT SYS_REFCURSOR
  )
 AS BEGIN
      OPEN TBLDATA_STATE_ALL FOR 
        Select * from ubr_structure_details where NE_STATUS = P_STATUS;

      NULL;
 END GET_ALL_STATE_FOR_EXCEL;

更新

当我选择ALL并Pending时,它正常工作。

但是,当我选择某个州名称和状态为待处理时,它无法正常工作。为此我的查询在

下面
PROCEDURE GET_DATA_WITH_STATUS_EXL
(
    P_STATE NVARCHAR2,
    P_STATUS NVARCHAR2,
    TBL_STATE_REP OUT SYS_REFCURSOR
)
AS
    BEGIN
      OPEN TBL_STATE_REP FOR 
           select * from ubr_structure_details where (state = P_STATE) and (NE_STATUS = p_status OR NE_STATUS = 'IS NULL');           
        NULL;
END  GET_DATA_WITH_STATUS_EXL;

2 个答案:

答案 0 :(得分:0)

您需要明确NULL值:

select * 
from ubr_structure_details
where (NE_STATUS = P_STATUS) or
      (NE_STATUS is null and P_STATUS is null);

我不建议将NULL用作“有效”值。 “待定”似乎是有效的状态;它应该存储为有效的状态值。

某些数据库支持NULL - 安全比较(例如ANSI标准is not distinct from。但是,Oracle尚不支持此功能。

编辑:

p_status作为字符串is null传递似乎是一个非常糟糕的主意。你真的应该修复这些状态。但是你可以在逻辑中包含这个:

select * 
from ubr_structure_details
where (NE_STATUS = P_STATUS) or
      (NE_STATUS is null and P_STATUS = 'IS NULL');

答案 1 :(得分:0)

除了戈登之外,你也可以尝试一下:

SELECT * FROM ubr_structure_details 
WHERE COALESCE(NE_STATUS, 'IS NULL') = COALESCE(P_STATUS, n'IS NULL');

非常肯定会破坏NE_STATUS的任何索引。如果是这样,并且假设您无法修复您的架构(如Gordon推荐的那样),那么您可以添加基于函数的索引以匹配新的过滤器。