MYSQL IN キーワードによる NULL 値の処理
SQL クエリでは、指定された値のセットに基づいて結果をフィルタリングするために IN キーワードがよく使用されます。ただし、NULL 値を扱う場合、MYSQL の IN キーワードは考慮が必要な独特の動作を示します。
問題: NULL 値を除外する IN キーワード
次のクエリを考えてみましょう:
select count(*) from Table1 where CurrentDateTime>='2012-05-28 15:34:02.403504' and Error not in ('Timeout','Connection Error');
このクエリは、エラー値が「タイムアウト」または「接続エラー」である行を除外することを目的としていますが、エラーが NULL である行は予期せず除外されます。 NULL 値を考慮するには、追加の条件 (またはエラーが NULL である) を追加する必要があります。
NULL 除外の理由
IN キーワードは、ブール値 ( 1/0)。ただし、場合によっては、ブール値の代わりに NULL を返すことがあります。 Error が NULL の場合、IN 式は次のようになります。
Error <> 'Timeout' AND Error <> 'Connection Error'
ここでは Null 比較ルールが適用されます。 Error の値が NULL であるため、式は true または false に評価できません。
NULL 値を含める解決策
NULL 値を含む行を含めるには、次の方法があります。次の解決策を使用します:
IN で COALESCE:
COALESCE(Error,'') not in ('Timeout','Connection Error');
OR 条件 IS NULL :
Error IS NULL OR Error not in ('Timeout','Connection Error');
短絡を伴う CASE 式:
CASE WHEN Error IS NULL THEN 1 ELSE Error not in ('Timeout','Connection Error') THEN 1 END = 1
例
次のデータについて考えます:
create table tbl(msg varchar(100) null, description varchar(100) not null); insert into tbl values('hi', 'greet'), (null, 'nothing');
クエリ:
select 'hulk' as x, msg, description from tbl where msg not in ('bruce','banner');
NOT IN 式が NULL と評価されるため、「hi」のみが返されます。 NULL メッセージ値を持つ行の場合。
結論
MYSQL の IN キーワードは、比較中に NULL 値を特別なケースとして扱います。 IN を使用する開発者は、この動作を認識し、NULL 値を含む行の除外や誤った解釈を避けるために適切な処理を実装する必要があります。
以上がMYSQL の IN キーワードは比較で NULL 値をどのように処理しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。