首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

MSSQL 查詢邏輯錯誤:AND/OR 優先級導致條件失效

     編輯:程式設計疑難解答

問題 SQL 與預期

原始語句:

SELECT * FROM Table 
WHERE Branch1 IS NULL 
  AND Branch2 NOT LIKE '%"不同意"%' 
  OR Branch3 NOT LIKE '%"不同意"%' 
ORDER BY AddTime DESC;

預期:查詢 Branch1 為空 且 (Branch2 不包含"不同意" 或 Branch3 不包含"不同意") 的記錄。

實際結果:返回了 Branch1 不為空 且 Branch2 包含"不同意" 的記錄。

根本原因:運算符優先級

在 SQL 中,AND 的優先級 高於 OR。數據庫實際執行的邏輯等同於:

(Branch1 IS NULL AND Branch2 NOT LIKE ...) 
OR 
(Branch3 NOT LIKE ...)

這導致只要 Branch3 NOT LIKE '%"不同意"%' 條件滿足,無論 Branch1 是否為 NULL、Branch2 是否包含關鍵字,該行都會被選中。

解決方案:使用括號明確分組

必須用括號將 OR 條件包裹,確保作為 AND 的整體右操作數:

SELECT * FROM Table 
WHERE Branch1 IS NULL 
  AND (
        Branch2 NOT LIKE '%"不同意"%' 
        OR Branch3 NOT LIKE '%"不同意"%'
      )
ORDER BY AddTime DESC;

補充:NULL 值的特殊處理

用戶後續反饋發現 Branch2 字段實際存儲的是 NULL 而非空字符串。在 SQL 中,NULL NOT LIKE '...' 結果為 UNKNOWN(非 TRUE),導致該行被過濾掉。

若需包含 NULL 值,應顯式判斷:

WHERE Branch1 IS NULL 
  AND (
        (Branch2 IS NULL OR Branch2 NOT LIKE '%"不同意"%')
        OR (Branch3 IS NULL OR Branch3 NOT LIKE '%"不同意"%')
      )

最佳實踐建議

  1. 永遠使用括號:混合 AND/OR 時,強制指定優先級,消除歧義。
  2. 注意 NULL 語義:任何與 NULL 的比較(=、!=、LIKE、NOT LIKE)結果均為 UNKNOWN,需用 IS NULL / IS NOT NULL 判斷。
  3. 格式化 SQL:換行縮進寫法能直觀反映邏輯結構,減少低級錯誤。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved