Oracle 4如果不为空,则进行变量交换

Oracle 4如果不为空,则进行变量交换,oracle,plsql,Oracle,Plsql,陷入一种逻辑。 我有4个变量,例如:var1、var2、var3、var4(它们的值也可以为null,但至少有一个不为null) 现在我想用非空值分配它们的值 I meant that if Var1 is null then Var1 = var2 or var3 or var4 (which ever is not null). if Var2 is null then Var2 should be var1 or var3 or var4 which ever is not null.

陷入一种逻辑。 我有4个变量,例如:var1、var2、var3、var4(它们的值也可以为null,但至少有一个不为null) 现在我想用非空值分配它们的值

I meant that if Var1 is null then Var1 = var2 or var3 or var4 (which ever is not null).
if Var2 is null then Var2 should be var1 or var3 or var4 which ever is not null.

Case: if var1=null,var2=x,var3=null,var4=y
expected result is: var1=x or y,var2=x,var3=x or y,var4=y
我试着用if语句,但在某个地方卡住了。我需要在Oracle plsql中执行此操作。 但任何语言的逻辑都会帮助我

我试过这样的东西(但这个不行):-


SQL语句中可以使用连续的
nvl
函数和位于最外层的
nvl2
函数:

create table mytable1( var1 int, var2 int, var3 int, var4 int );
insert into mytable1 values(null,null,null,null);

create table mytable2( var1 int, var2 int, var3 int, var4 int );
insert into mytable2 values(null,null,null,10);

select nvl2(nvl(nvl(nvl(var1,var2),var3),var4),
            nvl(nvl(nvl(var1,var2),var3),var4),0) myValue
  from mytable1;

MYVALUE
-------
   0

select nvl2(nvl(nvl(nvl(var1,var2),var3),var4),
            nvl(nvl(nvl(var1,var2),var3),var4),0) myValue
  from mytable2;

MYVALUE
-------
  10
或者可以使用PL/SQL例程,其中
nvl
函数不需要select语句,但
nvl2
需要:

SQL> set serveroutput on;
SQL> declare
  var1 int;
  var2 int;
  var3 int :=  9;
  var4 ;
  var  int;
begin
  var := nvl(nvl(nvl(var1,var2),var3),var4);
  select nvl2(var,var,0) into var from dual;          
  dbms_output.put_line(' The result value is  '||var);

  var3 := null;

  var := nvl(nvl(nvl(var1,var2),var3),var4);
  select nvl2(var,var,0) into var from dual;          
  dbms_output.put_line(' The result value is  '||var||' if all values are null ');

end; 

 The result value is  9
 The result value is  0 if all values are null 

如果每个值不为null,则以下解决方案将保持其不变;否则,它将用在该变量之后找到的第一个非空值替换它(如果在该变量之后找不到非空值,则循环回到前面)。更改COALESCE调用中参数的顺序将实现不同的规则,用于选择分配给最初为null的变量的非null值;但是,变量本身必须始终是第一个参数,以便在开始时为非NULL时保留其值

var1 := coalesce(var1, var2, var3, var4);
var2 := coalesce(var2, var3, var4, var1);
var3 := coalesce(var3, var4, var1, var2);
var4 := coalesce(var4, var1, var2, var3);

请注意,第二次赋值中的
var1
是第一次赋值中已修改的值,但结果仍然相同:考虑到变量的初始值,初始为空的每个变量将以“循环顺序”分配第一个非空值。

是否只有一个变量不为空?或者倍数不能为空?在后一种情况下,应该如何处理“我尝试了类似的东西(但这个不行)”-请提供您的实际代码。这更像是伪代码您没有正确定义预期的行为。如果多个变量不是
null
,怎么办?如果
Var2
Var3
Var4
都不是
null
,那么哪个值应该与
Var1
相关联?在我给出的例子中,许多值可以为null,但租用的一个值不会为null。所以Var1、Var2、Var3、Var4都可以为null,但至少有一个值。图灵-对于你的Q,var1=var2,var1=var3,var1=var4,任何东西都可以。搜索
coalesce
函数
var1 := coalesce(var1, var2, var3, var4);
var2 := coalesce(var2, var3, var4, var1);
var3 := coalesce(var3, var4, var1, var2);
var4 := coalesce(var4, var1, var2, var3);