语句只能这样了,不过,你可以在这个字段上建立函数索引来提高效率。
create index i_fun_aaa on tab (substr(work_id,16,17));这个语句在9i里面建立是没有问题的,在Oracle8i中,使用函数索引必须将初始化参数QUERY_REWRITE_ENABLED设置为TRUE

解决方案 »

  1.   

    substr(work_id,16,2)才是取后两位第三个参数表示子串的长度
      

  2.   

    substr(work_id,16)也可以,不知道跟substr(work_id,16,17)有没有速度上的差异,谁可以解释下?
      

  3.   

    函数substr(work_id,16,17)??用法错了,这表示从第16位起取17位!!
    该为:substr(work_id,17,1) ,速度一点都不慢阿
      

  4.   

    不好意思,没有多考虑,就认为楼主的函数写的正确。
    to  duanzilin(寻):这两个是一样的,速度慢是因为在字段work_id上使用了函数substr,如果在该字段上有索引,则破坏索引的的使用,而采用全表扫描的策略,对于几百万甚至更大的数据量,则效率就非常低。
    to zsfww1205:速度不慢是因为你的数据量很小,你可以做个测试,在表中插入百万数据,然后使用substr函数,你就知道他有多慢了。
      

  5.   

    谢谢!大家的帮忙
    特别感谢zakat(听者如歌) 
    create index i_fun_aaa on tab (substr(work_id,16,17));
    这种建索引后,它的查询顺序是什么?能不能解释下!