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

MySQLの予期しない結果:varchar列のIN句(数値、'文字列')

    あなたの表現は:

    where varCharColumn in (-1, '')
    

    リストには一貫したタイプが必要です。最初の要素は「これは整数のリストです」と言っているので、2番目の値は整数に変換されます。そして'' 0になります 。

    実際、数字以外で始まる英数字の文字列も0に変換されます。 整数比較用。だから、あなたはこの状況にあります

    'A' in (0)   --> TRUE
    'B' in (0)   --> TRUE
    'A' in ('B') --> FALSE
    

    これは次の方法で簡単にテストできます:

    select 'A' in (0) union all
    select 'B' in (0) union all
    select 'A' in ('B');
    

    コラムで実際の動作を確認できます:

    select val in (0), val in ('0'), val in (0, '')
    from (select 'A' as val) t
    

    これはtrue、false、trueを返します。ただし、val in (-1, 'B') この場合、FALSEを返します。 MySQLは、空の文字列を実際の文字列とは異なる方法で処理しています。おそらくドキュメントと矛盾しています。

    これが列に当てはまるということは、次の人によって示されています:

    select val in (0)
    from (select 'A' as val) t;
    

    論理は面白くないと誰が言ったのですか?

    これを修正するには、リストをすべて一貫したタイプにする必要があります。おそらく、数字を一重引用符で囲みます。



    1. MariaDBでのLPAD()のしくみ

    2. SQLとNoSQLの違い

    3. ORA-01843は有効な月ではありません-日付の比較

    4. sp_describe_first_result_setがSQLServerでどのように機能するか