sql >> データベース >  >> RDS >> Mysql

MYSQLINキーワードがNULL値を考慮しない理由

    これ:

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

    意味的には次と同等です:

    Error <> 'TimeOut' AND Error <> 'Connection Error'
    

    null比較に関する規則は、INにも適用されます。したがって、Errorの値がNULLの場合、データベースは式をtrueにすることができません。

    修正するには、次のようにします。

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

    またはさらに良い:

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

    またはさらに良い:

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

    または 短絡しない、CASEはどういうわけかあなたのクエリを短絡させることができます

    おそらく具体的な例で、 NULL NOT IN expressionの理由を説明できます。 何も返しません:

    このデータが与えられた場合: http://www.sqlfiddle.com/#!2/0d5da / 11

    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');
    

    'hi'のみが出力されます。

    NOT INは次のように翻訳されます:

    select 'hulk' as x, msg, description 
    from tbl where msg <> 'bruce' and msg <> 'banner';
    

    NULL<>'ブルース' 決定することはできません、真でも偽でもありません

    NULL<>'バナー' 決定することはできません、真でも偽でもありません

    したがって、null値の式は、次のように効果的に解決されます。

    can't be determined AND can't bedetermined
    

    実際、RDBMSがSELECT(MySQL、Postgresqlなど)でブール値をサポートしている場合は、その理由がわかります。 http://www.sqlfiddle.com/#!2/d41d8/828

    select null <> 'Bruce' 
    

    nullを返します。

    これもnullを返します:

    select null <> 'Bruce' and null <> 'Banner'
    

    NOT INを使用している場合 、これは基本的にAND式です。

    NULL AND NULL
    

    結果はNULLになります。つまり、次のことを行っているようなものです。 http://www.sqlfiddle.com/# !2 / 0d5da / 12

    select * from tbl where null
    

    何も返されません



    1. MySql、PHPはHTmlで画像を表示します

    2. OracleApplicationExpress入門-APEX

    3. SQL Server:日付範囲の計算

    4. 2つの異なるテーブルの要素で更新/削除する方法SQLite