WHERE条件中用DECODE,提示有错误,错误在哪里。
and decode(Vctn_size,'20','a.CTN_Size<'30'','40','a.CTN_Size>=30 and a.CTN_Size<=45','45','a.CTN_Size>45')Vctn_size是变量,等于20时,条件是'a.CTN_Size<'30',提示缺少右括号,请问错在哪里,怎么改。

解决方案 »

  1.   

    不能这样用...建议拼好SQL再动态执行.
      

  2.   

    你这种明显不行的,出来都是字符串,只有用动态SQL
      

  3.   

    给你一个动态拼接的例子吧declare
      lv_sql varchar2(1000);
     sql_command varchar2(5000);
      cursor   cur   is   select   课程   from   TB   group   by   课程;
     begin
      
      sql_command := 'select 姓名';
      for i in cur loop
      
        -- decode 写法
        sql_command := sql_command||' , max(decode(课程,'''||i.课程||''', 分数,0)) ' ||i.课程;
        -- case when 写法
        sql_command := sql_command||',max(case 课程 when '''||i.课程||''' then 分数 else 0 end) ' || i.课程;
        
      end loop;
        
       sql_command := sql_command||' from  TB   group   by   姓名'; 
       
       
       
       lv_sql := 'insert into temp_ss ' || sql_command;
       dbms_output.put_line(sql_command);
       execute immediate lv_sql;
       
    end;
    这里边有decode 的用法,按照例子把你的填过来就可以了
      

  4.   

    decode()这个函数一般是用在SELECT后,在PL/SQL中,也不能用在SELECT之外,这么好个函数真应该让甲骨文好好做做。
      

  5.   

    直接用chr(39)这个函数得了,否则很多单引号会看花眼的
      

  6.   

    lz试一试这句。
    AND ((Vctn_size = '20' AND a.CTN_Size < 30)
       OR (Vctn_size = '40' AND a.CTN_Size >= 30 and a.CTN_Size <=45)
       OR (Vctn_size = 45 AND a.CTN_Size>45)) 
    性能不能保证哦 :-)