select t.*, t.rowid from test t
where t.name= '1'
if 1 = 1 then
and t.id= '21'
end if;
有什么方法可以解决这个问题?

解决方案 »

  1.   

    只有用DECODE或者 CASE WHEN实现
    比如t.id=decode(:in_id,1,'21',t.id)
      

  2.   

    where中不能带if,看你的sql完全可以写成如下形式的啊
    select t.*, t.rowid
      from test t
     where t.name = '1'
       and t.id = '21';
      

  3.   

    t.id=decode(:in_id,1,'21',t.id)
    不知道你对DECODE熟悉吗?我解释下这个,这是我们经常用的,类似IF的效果
    如果传进来的条件:in_id=1的话,那这个where条件就是t.id='21'
    如果不是1的话,条件就变成了t.id=t.id
      

  4.   


    create table test(
     id VARCHAR2(10),
     name VARCHAR2(30)
    );INSERT INTO test(id,name) values('1','luoyoumou1');
    INSERT INTO test(id,name) values('3','luoyoumou3');
    INSERT INTO test(id,name) values('7','luoyoumou7');
    INSERT INTO test(id,name) values('13','luoyoumou13');
    INSERT INTO test(id,name) values('21','luoyoumou21');
    INSERT INTO test(id,name) values('21','1');
    COMMIT;select t.*, t.rowid
    from test t
    where t.name='1'
    and t.id=decode('&in_id',1,'21',t.id);
      

  5.   

    and or ()组合不能表示if么?
      

  6.   

    and 前后为真则真
    or 单个为真则真
    你的意图是如果满足某个条件的话追加and t.id= '21' 这个单个语名的话
    按三楼的方式变通解决
    如果是业务需求的话,可以在程序中或写存储过程解决!
      

  7.   

    你该去看些pl sql 或则nvl都可以做的。
      

  8.   


    用decode或者case when语句来判断。当然你可以在plsql块里面 用动态语句来写if判断。
      

  9.   

     
     DECODE,CASE WHEN 或动态sql。
      

  10.   


     DECODE,CASE WHEN 或动态sql
      

  11.   


       DECODE,CASE WHEN 或动态sql
      

  12.   


    当t.id='21 '的时候就实现不了了,如何可以忽略空格呢?
      

  13.   


    不能用if ,但是可以用case when 
    select * from tb
    where id=(case when num=1 then 5 else id end)
      

  14.   

    select * from tb
    where id=(case when num=1 then 5 else id end)
    这种语句运行,
    和ORACLE版本有关么