坚持一个逻辑。 我有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;
答案 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