原始語句:
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;
用戶後續反饋發現 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 '%"不同意"%')
)
IS NULL / IS NOT NULL 判斷。