比如参数为pi:如果参数pi为空,就返回b.DM,就相当于这个条件没执行了,因为b.DM=b.DM恒等于 select *from TABLE1 a , TABLE1 b where a.XH=b.XH and A.LX='02' and b.DM=nvl(pi,b.DM)谢谢,版主大大。我忘记说b.DM是动态赋值的。因为一些特殊原因,只能通过SQL语句判断。 如果有传参数,就执行这段查询条件。
这个最好由应用来控制 是否有 and 的查询条件吧。 在应用里面 如果 有这个查询条件 ,那就加 and b.DM=xx 如果条件为空,那么 就不加这条语句
如果是plsql块的话, 就用动态语句拼接,然后 执行就好了。
情况特殊,不能在应用里控制,所以只能用SQL语句控制。
假设传入的值为V_DM select *from TABLE1 a , TABLE1 b where a.XH=b.XH and A.LX='02' and (b.DM=V_DM OR V_DM IS NULL)
declare vcsql varchar2(2000) vcsql:='select * from table1 a,table2 b where a.xh=b.xh and a.lx=''02'''; if v_dm is null then execute immediate vcsql; else vcsql:=vcsql || 'and b.dm='''||v_dm||''''; execute immediate vcsql; end;
版主那个 select *from TABLE1 a , TABLE1 b where a.XH=b.XH and A.LX='02' and b.DM=NVL(expr,b.DM); 应该是可以的啊。
NVL(EXPR,BB,BBB)这个是可以的,你没有试过就判断这个不能~ 还是先理解一下再试吧
不用那么复杂,只要把等号变成like就可以了,如下: 有值: select *from TABLE1 a , TABLE1 b where a.XH=b.XH and A.LX='02' and b.DM like 'aaa%'无值: select *from TABLE1 a , TABLE1 b where a.XH=b.XH and A.LX='02' and b.DM like '%'
b.DM = NVL(:1,b.DM) 或者 (b.DM = :1 OR :1 IS NULL) 就这两种写法,甭浪费时间了
select *from TABLE1 a , TABLE1 b
where a.XH=b.XH and A.LX='02' and b.DM=nvl(pi,b.DM)谢谢,版主大大。我忘记说b.DM是动态赋值的。因为一些特殊原因,只能通过SQL语句判断。
如果有传参数,就执行这段查询条件。
在应用里面 如果 有这个查询条件 ,那就加 and b.DM=xx
如果条件为空,那么 就不加这条语句
情况特殊,不能在应用里控制,所以只能用SQL语句控制。
select *from TABLE1 a , TABLE1 b
where a.XH=b.XH and A.LX='02' and (b.DM=V_DM OR V_DM IS NULL)
vcsql:='select * from table1 a,table2 b where a.xh=b.xh and a.lx=''02''';
if v_dm is null then
execute immediate vcsql;
else
vcsql:=vcsql || 'and b.dm='''||v_dm||'''';
execute immediate vcsql;
end;
select *from TABLE1 a , TABLE1 b
where a.XH=b.XH and A.LX='02' and b.DM=NVL(expr,b.DM);
应该是可以的啊。
有值: select *from TABLE1 a , TABLE1 b
where a.XH=b.XH and A.LX='02' and b.DM like 'aaa%'无值: select *from TABLE1 a , TABLE1 b
where a.XH=b.XH and A.LX='02' and b.DM like '%'
或者 (b.DM = :1 OR :1 IS NULL)
就这两种写法,甭浪费时间了