时间:2018-03-15 07:12:06

标签: oracle

where子句中的字段没有进行空比较 代码如下。它只是一个没有进行空比较的示例代码。

create or replace function document_history
    (V_process_id IN) 
    return varchar2 
AS   
    V_document_id number;         
    V_process_status varchar2(10);   

select document_id, process_status 
into V_document_id, V_process_status 
from document_details 
where process_id =V_process_id ;  

update staging2 
set (country,land) = (select country, land 
                      from staging 
                      where document_id =V_document_id);  
commit;  

return null;  
end document_history;

如果输入变量V_document_id为null,则子查询不会返回任何值,我也期望输出为空值。

我尝试了以下场景来获取子查询的输出:

  1. select country, land from staging where nvl(document_id,'*') = nvl(V_document_id,'*');

  2. select country, land from staging where document_id = nvl(V_document_id,null);

  3. 我声明了一个带null值的变量,并在nvl函数中使用,
    nl_variable:=null; select country, land from staging where document_id = nvl(V_document_id,nl_variable);

  4. 我尝试了trim(V_document_id)

  5. 仅对第一个选项,查询将返回值。

    其中,我的真实过程/函数很大,并且在where子句中有很多列,如果输入为null则需要返回值,并且我无法在{{1}的所有列上使用nvl(input,'*') 1}}子句,也不能使用where(因为比较应该像IS NULL)。

    有人可以帮助我吗,(document_id =V_document_id)如何在这里进行比较?

1 个答案:

答案 0 :(得分:2)

看起来我可以提供解决方案。事实上,这个解决方案是一个黑客

只需替换

document_id =V_document_id

decode(document_id,V_document_id,1,0)=1

来自Oracle documentation

  

但是,Oracle在评估DECODE函数时认为两个空值相等。有关语法和其他信息,请参阅DECODE。