ホームページ >データベース >mysql チュートリアル >SQL の WHERE 句がパラメータを無視するのはなぜですか?

SQL の WHERE 句がパラメータを無視するのはなぜですか?

DDD
DDDオリジナル
2025-01-19 10:06:10362ブラウズ

Why Does My SQL WHERE Clause Ignore a Parameter?

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 が「2」である university および 'massive' の全文検索が または の最初の OR に一致する テーブルからレコードを選択することを目的としています。姓に「箱」が含まれています。 ただし、結果セットには、university='2' 条件を満たさないエントリが含まれる可能性があります。

問題は SQL の演算子の優先順位にあります。ANDOR よりも優先されます。 クエリの暗黙的なグループ化は次のとおりです:

<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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。