4变量交换,如果不为null

时间:2018-06-18 14:43:33

标签: 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.

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中执行此操作。 但任何语言的逻辑都会对我有帮助。

我尝试了类似的东西(但这不会炒): -

If (Var1 is null) then
Var1 =var2;
if(Var2 is null) then
var1=var3;
var2=var3;
if(Var3 is null) then
var1=var4;
var2=var4;
var3=var4;

2 个答案:

答案 0 :(得分:3)

以下解决方案保持每个值不变,如果它不为null;否则它用在该变量之后找到的第一个非空值替换它(如果在变量之后找不到非空值,则循环回到前面)。更改COALESCE调用中参数的顺序将实现不同的规则,用于选择分配给最初为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的每个变量在&#中分配了第一个非NULL值34;周期性秩序"考虑变量的初始值。

答案 1 :(得分:0)

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

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