sql >> Databáze >  >> RDS >> Mysql

Neočekávané výsledky MySQL:klauzule IN (číslo, 'řetězec') ve sloupci varchar

Váš výraz je:

where varCharColumn in (-1, '')

Seznam musí mít konzistentní typy. První prvek říká „toto je seznam celých čísel“, takže druhá hodnota je převedena na celé číslo. A '' se změní na 0 .

Ve skutečnosti je každý alfanumerický řetězec, který začíná jinou než číslicí, převeden na 0 pro celočíselné srovnání. Takže máte tuto situaci

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

Můžete to snadno otestovat pomocí:

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

Můžete to vidět v akci se sloupcem:

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

Toto vrátí true, false, true. Pamatujte však, že val in (-1, 'B') v tomto případě vrací FALSE. MySQL zachází s prázdným řetězcem jinak než se skutečným řetězcem, možná v rozporu s dokumentací.

Že to platí se sloupci, ukazuje:

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

Kdo řekl, že logika nemůže být zábavná?

Chcete-li tento problém vyřešit, vytvořte seznam konzistentních typů, pravděpodobně tím, že čísla umístíte do jednoduchých uvozovek.



  1. Mysql single query join 3 table a získat všechny výsledky

  2. Příběh dvou shluků faktorů

  3. Připojení ke stejnému stolu více než jednou

  4. Uložená procedura, která exportuje data do souborů csv, exportuje pouze do jednoho souboru