比如参数为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)

解决方案 »

  1.   

    比如参数为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语句判断。
    如果有传参数,就执行这段查询条件。
      

  2.   

    这个最好由应用来控制 是否有 and 的查询条件吧。
    在应用里面 如果 有这个查询条件 ,那就加 and b.DM=xx
    如果条件为空,那么 就不加这条语句
      

  3.   

    如果是plsql块的话, 就用动态语句拼接,然后 执行就好了。 
      

  4.   


    情况特殊,不能在应用里控制,所以只能用SQL语句控制。
      

  5.   

    假设传入的值为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)
      

  6.   

    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;
      

  7.   

    版主那个
    select *from TABLE1 a  ,  TABLE1 b
        where  a.XH=b.XH and A.LX='02'  and b.DM=NVL(expr,b.DM);
    应该是可以的啊。
      

  8.   

    NVL(EXPR,BB,BBB)这个是可以的,你没有试过就判断这个不能~ 还是先理解一下再试吧
      

  9.   

    不用那么复杂,只要把等号变成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 '%'
      

  10.   

    b.DM = NVL(:1,b.DM)
    或者 (b.DM = :1 OR :1 IS NULL)
    就这两种写法,甭浪费时间了