先看以下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兩邊的條件只能滿足其中之一即可,不知道大家明白沒有,當然如果有更好的方法或不同的意見歡迎交流,共同進步!