sql >> Database >  >> RDS >> Mysql

MySQL onverwachte resultaten:IN-clausule (getal, 'string') op een varchar-kolom

Je uitdrukking is:

where varCharColumn in (-1, '')

De lijst moet consistente typen hebben. Het eerste element zegt "dit is een lijst met gehele getallen", dus de tweede waarde wordt geconverteerd naar een geheel getal. En '' wordt 0 .

In feite wordt elke alfanumerieke tekenreeks die begint met een niet-cijfer ook geconverteerd naar 0 voor een geheeltallige vergelijking. Dus je hebt deze situatie

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

U kunt dit gemakkelijk testen met:

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

Je kunt het in actie zien met een kolom:

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

Dit retourneert waar, onwaar, waar. Houd er echter rekening mee dat val in (-1, 'B') geeft in dit geval FALSE terug. MySQL behandelt de lege string anders dan een echte string, misschien in strijd met de documentatie.

Dat dit geldt voor kolommen blijkt uit:

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

Wie zei dat logica niet leuk kan zijn?

Om dit op te lossen, moet u ervoor zorgen dat de lijst allemaal van een consistent type is, waarschijnlijk door enkele aanhalingstekens rond de getallen te plaatsen.



  1. Grondbeginselen van tabeluitdrukkingen, deel 9 – Weergaven, vergeleken met afgeleide tabellen en CTE's

  2. MySQL DROP-DATABASE

  3. Hoe SQL Server T-SQL-functie te gebruiken SUM:5 use-cases

  4. SQLite JSON_ARRAY_LENGTH()