sql >> Base de Datos >  >> RDS >> Mysql

Resultados inesperados de MySQL:cláusula IN (número, 'cadena') en una columna varchar

Tu expresión es:

where varCharColumn in (-1, '')

La lista debe tener tipos consistentes. El primer elemento dice "esta es una lista de números enteros", por lo que el segundo valor se convierte en un número entero. Y '' se convierte en 0 .

De hecho, cualquier cadena alfanumérica que comience con un dígito que no sea también se convierte a 0 para una comparación de enteros. Entonces, tienes esta situación

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

Puede probar esto fácilmente con:

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

Puedes verlo en acción con una columna:

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

Esto devuelve verdadero, falso, verdadero. Sin embargo, tenga en cuenta que val in (-1, 'B') devuelve FALSO en este caso. MySQL está tratando la cadena vacía de manera diferente a una cadena real, quizás de manera inconsistente con la documentación.

Que esto es cierto con las columnas lo demuestra:

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

¿Quién dijo que la lógica no puede ser divertida?

Para arreglar esto, haga que la lista sea de tipos consistentes, probablemente colocando comillas simples alrededor de los números.