declare @fieldname varchar(50) declare @fieldvalue nvarchar(100) set @fieldname='chassisno' --这里可传入chassisno,plateno,owner,contacttelno其中之一或不传 set @fieldvalue='zuowenjun' if @fieldname = 'chassisno' begin select * from tablename where chassisno=@fieldvalue end else if @fieldname = 'plateno' begin select * from tablename where plateno=@fieldvalue end else if @fieldname = 'owner' begin select * from tablename where [owner]=@fieldvalue end else if @fieldname = 'contacttelno' begin select * from tablename where contacttelno=@fieldvalue end else begin select * from tablename end
现在如果需要用一句sql语句就要实现上述逻辑判断并查询结果,大家可能会想到采用如下拼接的方法实现:
declare @sqltext nvarchar(2000) set @sqltext='select * from tablename where ' + @fieldname + '=''' + @fieldvalue +'''' execute (@sqltext)
虽然这样看起来确实能实现逻辑判断并查询结果,但看起来不够直观,修改麻烦且容易出错,而且有一定的局限性,因为这里@fieldname与表字段相同,拼接相对容易些,若不相同的情况下,那就无法实现了,所以我这里采用了另一种方法,效率暂且不说,但绝对简单易用而且够灵活,请看如下sql语句:
select * from tablename a where 1=1 --(如果需要其它条件则用其它条件,否则可以这样或不要,如果不要则下面的第一个and需去掉) and ((@fieldname = 'chassisno' and a.chassisno=@fieldvalue) or (@fieldname<>'chassisno') ) and ((@fieldname = 'plateno' and a.plateno=@fieldvalue) or (@fieldname<>'plateno') ) and ((@fieldname = 'owner' and a.[owner]=@fieldvalue) or (@fieldname<>'owner') ) and ((@fieldname = 'contacttelno' and b.contacttelno=@fieldvalue) or (@fieldname<>'contacttelno') )
经验证这条sql语句可以实现逻辑判断并查询结果,而且就算@fieldname与表字段不相同,我们也可以直接更换相应的字段即可,现在来简要说明一下其原理:
and ((@fieldname = 'chassisno' and a.chassisno=@fieldvalue) or (@fieldnamea8093152e673feb7aba1828c43532094'chassisno') )
因为是and关联,所以后面括号里面的条件是必须满足,又因为括号里面采用了or关联,所以括号里面的两边的条件是可以符合一个即可的,翻译一下就是,若@fieldname = 'chassisno'时,则要求a.chassisno=@fieldvalue,否则只要@fieldnamea8093152e673feb7aba1828c43532094'chassisno'时,则忽略掉前前面的关联条件。注意他们的特点是互斥的,也就是or两边的条件只能满足其中之一即可,不知道大家明白没有,当然如果有更好的方法或不同的意见欢迎交流,共同进步!
