ホームページ  >  記事  >  データベース  >  正確なフィルタリングのために MySQL の IN キーワードの NULL 値を処理する方法は?

正確なフィルタリングのために MySQL の IN キーワードの NULL 値を処理する方法は?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-23 16:09:02337ブラウズ

How to Handle NULL Values in MySQL's IN Keyword for Accurate Filtering?

MySQL の IN キーワードでの NULL 処理を理解する

MySQL の IN キーワードはブール値の結果を返しますが、常にそうとは限らないことに注意することが重要です1 (真) または 0 (偽) を返します。 NULL の特殊なケースでは、特にデータをフィルタリングするときに予期しない動作が発生する可能性があります。

IN での NULL のケース

次のクエリは、Error 列が次のいずれかの行を除外します。 'タイムアウト' または '接続エラー':

select count(*) from Table1 where CurrentDateTime>'2012-05-28 15:34:02.403504' and Error not in ('Timeout','Connection Error')

ただし、このクエリには、Error が NULL である行は含まれません。これは、値を NULL と比較するときに IN 演算子が NULL と評価されるためです。その結果、式「Error not in ('Timeout','Connection Error')」は、NULL 値を持つ行では false になります。

NULL 処理の回避策

NULL 値を扱うときに正しい結果を取得するには、いくつかの方法があります:

1. COALESCE() を使用して空の文字列をデフォルトにします

COALESCE(Error,'') not in ('Timeout','Connection Error')

2. OR を使用して NULL と値の不一致をテストします

Error IS NULL OR Error not in ('Timeout','Connection Error')

3. CASE を使用してブール評価をエミュレートする

CASE WHEN Error IS NULL THEN 1
 ELSE Error not in ('Timeout','Connection Error') THEN 1
 END = 1

大文字と小文字の区別とパフォーマンス

OR は短絡しません。つまり、最初のものは誤りです。一方、CASE は、最初の条件が満たされた場合に評価を停止できます。これにより、潜在的な NULL 値が多数ある場合のパフォーマンスが向上します。

NULL の比較例

IN 式における NULL の動作を説明するために、次の表を検討してください。

msg description
hi greet
NULL nothing

式:

select 'hulk' as x, msg, description from tbl where msg not in ('bruce','banner')

は、「hi」を含む行のみを返します。これは、他の行の msg が NULL であるため、不確定な比較が行われるためです。

結論として、MySQL の IN キーワードは NULL 値と比較すると NULL を返し、フィルタリングで予期しない結果が生じる可能性があります。これに対処するには、上記で説明した回避策のいずれかを使用して、正確なデータ取得を保証します。

以上が正確なフィルタリングのために MySQL の IN キーワードの NULL 値を処理する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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