首先看以下sql邏輯語句塊:
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 (@fieldname’chassisno’) )
因為是AND關聯,所以后面括號里面的條件是必須滿足,又因為括號里面采用了OR關聯,所以括號里面的兩邊的條件是可以符合一個即可的,翻譯一下就是,若@fieldname = ‘chassisno’時,則要求a.chassisno=@fieldvalue,否則只要@fieldname’chassisno’時,則忽略掉前前面的關聯條件。注意他們的特點是互斥的,也就是OR兩邊的條件只能滿足其中之一即可,不知道大家明白沒有,當然如果有更好的方法或不同的意見歡迎交流,共同進步!
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END