Dit udtryk er:
where varCharColumn in (-1, '')
Listen skal have ensartede typer. Det første element siger "dette er en liste over heltal", så den anden værdi konverteres til et heltal. Og ''
bliver 0
.
Faktisk konverteres enhver alfanumerisk streng, der starter med et ikke-ciffer, også til 0
for en heltalssammenligning. Så du har denne situation
'A' in (0) --> TRUE
'B' in (0) --> TRUE
'A' in ('B') --> FALSE
Du kan nemt teste dette med:
select 'A' in (0) union all
select 'B' in (0) union all
select 'A' in ('B');
Du kan se det i aktion med en kolonne:
select val in (0), val in ('0'), val in (0, '')
from (select 'A' as val) t
Dette returnerer sandt, falsk, sandt. Bemærk dog, at val in (-1, 'B')
returnerer FALSK i dette tilfælde. MySQL behandler den tomme streng anderledes end en rigtig streng, måske ikke i overensstemmelse med dokumentationen.
At dette er sandt med kolonner, udstilles af:
select val in (0)
from (select 'A' as val) t;
Hvem sagde, at logik ikke kan være sjovt?
For at rette op på dette skal du gøre listen af ensartede typer, sandsynligvis ved at sætte enkelte anførselstegn rundt om tallene.