当前位置: 代码迷 >> Sql Server >> 这种高级查询怎么做不想全用IF来判断太不科学了
  详细解决方案

这种高级查询怎么做不想全用IF来判断太不科学了

热度:97   发布时间:2016-04-24 09:56:35.0
这种高级查询如何做不想全用IF来判断太不科学了
//表的字段a,b,c,d四个字段作为条件查询时
//当程序没有给这四个字段付值时查询select * from table
//当程序给a字段付值是查询语句为select * from table where a='程序付的值'
//当程序给b字段付值是查询语句为select * from table where b='程序付的值'
//当程序给a,b字段都付值是查询语句为select * from table where a='程序付的值' and b='程序付的值'
//依次类推下去,也就是字段有值就带上条件,没有值就不带。要怎么做呢?
------解决思路----------------------
select * from table where 
(a='' or a='a') and (b='' or b='b') and (c='' or c='c') and (d='' or d='d')

------解决思路----------------------
引用:
select * from table where 
(a='' or a='a') and (b='' or b='b') and (c='' or c='c') and (d='' or d='d')

a='' @a=''
所以更严谨点的是不论程序赋没赋值,都要把参数传进来@a,@b,@c,@d

select * from t
where (ISNULL(@a,'')='' or a=@a) and (ISNULL(@b,'')='' or b=@b) and (ISNULL(@c,'')='' or c=@c) and (ISNULL(@d,'')='' or d=@d)

但这种写法毕竟是为了开发省事,对SQL性能来说,用IF拼不同的SQL串才是性能优先(推荐)。
------解决思路----------------------
可以再Where中用case when



select t.a,t.b,t.c,t.d from table1 as t where t.a=case when len(isnull(@a,''))>0 then @a else t.a end .....
--如果@a等于空,则t.a=t.a  相当于没加这个条件,其他几个同样处理


------解决思路----------------------
用动态拼接吧,5楼给出了例子
------解决思路----------------------
用拼接sql来处理
------解决思路----------------------
要么在程序里就用IF判断拼接好,要么就用动态SQL语句拼一下吧
LZ为啥觉得用IF就不科学了?没人说过用IF会性能很差吧……
------解决思路----------------------
像5楼一样动态拼接sql吧
------解决思路----------------------
每个字段、输入这样写:

TempA=" AND (a='"& textA.text &"' or '"& textA.text &"'='') "

就不用if了

当然,最好加上 反 sql注入 的检查
------解决思路----------------------
ORCALE 里面可以用A=DECODE(@A,'',A,@A)
貌似SQL里面没有 只能case  when ,
CASE @A =‘’ then @a=a else @a=textbox.text
------解决思路----------------------
判断不影响性能
  相关解决方案