如何使用put null,是null检查,所有在SQL查询中动态检查

时间:2014-07-03 10:49:54

标签: sql oracle plsql null

我需要更新pl / sql中的一部分。 在那个pl / sql中,我们根据给定的过滤器在临时表中插入数据。

现在正在插入数据

 select blah where given_timestamp is null

但现在我需要做的是在将数据插入临时表之前检查一些情况。基于这些检查,我必须在where子句中给出条件,如下所述:

1. where some_timestamp is null
2. where some_timestamp is not null
3. where some_timestamp is null or given_timestamp is not null

我的问题: 我无法找到适合这里的逻辑,以便where条件应该适用于所有这三种情况,因此它不应该破坏现有的功能。 (目前的sp本身太大了)

我尝试了什么: 我试图在参数中取出数据:

if(condition 1) then
set param_timestamp=(select some_timestamp from xyz where some_timestamp is null);
elsif (condition 2) then
set param_timestamp=(select some_timestamp from xyz where some_timestamp is not null);
else
set param_timestamp=(select some_timestamp from xyz);



select blah where some_timestamp in (param_timestamp)

这种方法的问题在于我在检查空值时失败了。 我尝试了其他一些方法,但是在检查空值时,所有这些方法都会产生问题。

任何帮助都将不胜感激。

我需要做的就是动态地给出这个条件(对于null,而不是null,所有)

2 个答案:

答案 0 :(得分:1)

由于您的查询仅在选择null和非null值方面有所不同,因此您可以使用变量。有两个变量用于"选择空时间戳"和"选择非空时间戳"并根据所需规则进行设置。不要使用BOOLEAN而是使用数字类型,因此您可以在SQL查询中使用它们。 (Oracle SQL并不了解BOOLEAN。)

v_sel_nulls integer; -- 1 = yes , 0 = no
v_sel_nonnulls integer; -- 1 = yes , 0 = no


if (condition block 1) then
  v_sel_nulls := 1;
  v_sel_nonnulls := 0;
elsif (condition block 2) then
  v_sel_nulls := 0;
  v_sel_nonnulls := 1;
else
  v_sel_nulls := 1;
  v_sel_nonnulls := 1;
end if;

select ...
into ...
from ...
where (v_sel_nulls = 1 or some_timestamp is not null)
and (v_sel_nonnulls = 1 or some_timestamp is null);

答案 1 :(得分:0)

你能使用带NVL功能的标志吗?并评估它,如

select nvl(some_timestamp, '01-01-1900') from xyz where some_timestamp;