最近小弟的项目里面有个需求,需求很简单,有个indicatortag表.里面有个name字段,需求要求模糊查询name字段,但是如果用户在页面不填,那么就查所有。
小弟我用了一个case when语句:
select it.pk_id
......
from indicatortag it
inner join ...
...
where ( case when :text = ' ' or instr(lower(it.name), lower(:text))=1 then 'T'
        else 'F'
      )='T'这张表数据量有点大,模糊查询会有点慢,但是我不解的是当参数:text传过来的是‘ ’的时候,仍然很慢,就好像也进行了模糊查询。不是当判断:text= ' '的时候条件已经为真了嘛,应该跳过后面的模糊查询了呀?小弟很不解,把后面的“or instr(lower(it.name), lower(:text))=1” 去掉以后,当:text = ' '的时候就飞快了,这表示如果加上or的话,哪怕:text = ' ',好像数据库仍然做了模糊查询,虽然查询结果是全部查出来了。
小弟很不理解,不知有什么解决方法。数据库是oracle 9,我在sqldeveloper里面运行的.

解决方案 »

  1.   

    case when :text = ' ' or instr(lower(it.name), lower(:text))=1 then 'T'
      else 'F'它是不会一个为真就不再判断另一个条件的。所以你的模糊查询都是会走的。
      

  2.   

    sql执行计划不是靠乱猜的,
    建议楼主走个执行计划,看你是否走索引等之类
      

  3.   

    我试过:text=` `单独放在一个when子句里面,但是好像仍然会走模糊查询
      

  4.   

    你这个东西根本不应该在数据库实现,而应该放在应用去实现,针对用户不同的选择,拼出不同的SQL
      

  5.   

    ( case when :text is null or instr(lower(it.name), lower(:text))=1 then 'T'
      else 'F'
      )='T'