首頁  >  文章  >  資料庫  >  SQL語句技巧:查詢時巧用OR實作邏輯判斷

SQL語句技巧:查詢時巧用OR實作邏輯判斷

伊谢尔伦
伊谢尔伦原創
2016-11-23 13:43:171485瀏覽

先看以下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 = &#39;chassisno&#39; AND a.chassisno=@fieldvalue) OR (@fieldname<>&#39;chassisno&#39;) )
AND ((@fieldname = &#39;plateno&#39; AND a.plateno=@fieldvalue) OR (@fieldname<>&#39;plateno&#39;) )
AND ((@fieldname = &#39;owner&#39; AND a.[owner]=@fieldvalue) OR (@fieldname<>&#39;owner&#39;) )
AND ((@fieldname = &#39;contacttelno&#39; AND b.contacttelno=@fieldvalue) OR (@fieldname<>&#39;contacttelno&#39;) )

經驗證這條SQL語句可以實現邏輯判斷並查詢結果,而且就算@fieldname與表格欄位不相同,我們也可以直接更換對應的欄位即可,現在來簡單說明一下其原理:

AND ((@fieldname = 'chassisno' AND a.chassisno=@fieldvalue) OR (@ fieldname'chassisno') )

因為是AND關聯,所以後面括號裡面的條件是必須滿足,又因為括號裡面採用了OR關聯,所以括號裡面的兩邊的條件是可以符合一個即可的,翻譯一下就是,若@fieldname = 'chassisno'時,則要求a.chassisno=@fieldvalue,否則只要@fieldname'chassisno'時,則忽略掉前前面的關聯條件。注意他們的特徵是互斥的,也就是OR兩邊的條件只能滿足其中之一即可,不知道大家明白沒有,當然如果有更好的方法或不同的意見歡迎交流,共同進步!


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn