SQL WHERE 子句故障排除:為什麼參數被忽略
SQL 查詢有時會產生意外結果,特別是當 WHERE
子句包含多個條件時。 這通常源自於不正確的運算子優先順序和分組。
讓我們檢查一下 WHERE
子句似乎忽略參數的場景:
<code class="language-sql">SELECT * FROM people WHERE university='2' AND MATCH (lname,fname) AGAINST ('+massive' IN BOOLEAN MODE) OR (fname LIKE '%box%' OR lname LIKE '%box%')</code>
此查詢旨在從people
表中選擇記錄,其中university
為「2」並且對「大量」匹配的全文搜尋或第一個或姓氏包含“box”。 但是,結果集可能包含不滿足 university='2'
條件的條目。
問題在於 SQL 的運算子優先權:AND
優先於 OR
。 查詢的隱式分組是:
<code class="language-sql">(university='2') AND ( (MATCH (lname,fname) AGAINST ('+massive' IN BOOLEAN MODE)) OR (fname LIKE '%box%' OR lname LIKE '%box%') )</code>
請注意 university='2'
僅適用於全文搜尋。 為了修正這個問題,我們需要明確括號來確保 AND
條件適用於所有部分:
<code class="language-sql">SELECT * FROM people WHERE (university='2') AND (MATCH (lname,fname) AGAINST ('+massive' IN BOOLEAN MODE) OR fname LIKE '%box%' OR lname LIKE '%box%')</code>
透過將所有條件分組在括號內,我們強制執行預期的邏輯,確保只傳回滿足所有指定條件的記錄。 這凸顯了在 SQL 中建構複雜 WHERE
子句時仔細使用括號的重要性。
以上是為什麼我的 SQL WHERE 子句忽略參數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!