Mysql
 sql >> Database >  >> RDS >> Mysql

Risultati imprevisti MySQL:clausola IN (numero, 'stringa') su una colonna varchar

La tua espressione è:

where varCharColumn in (-1, '')

L'elenco deve avere tipi coerenti. Il primo elemento dice "questo è un elenco di numeri interi", quindi il secondo valore viene convertito in un numero intero. E '' diventa 0 .

Infatti, anche qualsiasi stringa alfanumerica che inizia con una cifra diversa da quella viene convertita in 0 per un confronto intero. Quindi, hai questa situazione

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

Puoi facilmente testarlo con:

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

Puoi vederlo in azione con una colonna:

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

Questo restituisce vero, falso, vero. Tuttavia, nota che val in (-1, 'B') restituisce FALSE in questo caso. MySQL tratta la stringa vuota in modo diverso da una stringa reale, forse in modo incoerente con la documentazione.

Che questo sia vero con le colonne è dimostrato da:

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

Chi ha detto che la logica non può essere divertente?

Per risolvere questo problema, fai in modo che l'elenco sia di tipo coerente, probabilmente inserendo virgolette singole attorno ai numeri.