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,则子查询不会返回任何值,我也期望输出为空值。
我尝试了以下场景来获取子查询的输出:
select country, land from staging where nvl(document_id,'*') = nvl(V_document_id,'*');
select country, land from staging where document_id = nvl(V_document_id,null);
我声明了一个带null
值的变量,并在nvl
函数中使用,
nl_variable:=null;
select country, land from staging where document_id = nvl(V_document_id,nl_variable);
我尝试了trim(V_document_id)
。
仅对第一个选项,查询将返回值。
其中,我的真实过程/函数很大,并且在where子句中有很多列,如果输入为null
则需要返回值,并且我无法在{{1}的所有列上使用nvl(input,'*')
1}}子句,也不能使用where
(因为比较应该像IS NULL
)。
有人可以帮助我吗,(document_id =V_document_id)
如何在这里进行比较?
答案 0 :(得分:2)
看起来我可以提供解决方案。事实上,这个解决方案是一个黑客
只需替换
document_id =V_document_id
与
decode(document_id,V_document_id,1,0)=1
但是,Oracle在评估DECODE函数时认为两个空值相等。有关语法和其他信息,请参阅DECODE。