//表的字段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')
------解决思路----------------------
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
------解决思路----------------------
判断不影响性能