2012-07-12 17 views
5

Tengo un resultado interesante y no entiendo por qué.MySQL Query: la cláusula `where (varchar)` devuelve elementos que comienzan con un número solamente. ¿Por qué?

SELECT * 
    FROM items im 
WHERE ItemNumber 

ItemNumber es una varchar(50).

Los resultados de esta consulta devuelven todos los elementos que el ItemNumber comienza con un número. Si el ItemNumber comienza con una letra, se excluye.

¿Alguien tiene una explicación de por qué la consulta interactúa de esta manera?

+0

Asumo que son conscientes de que la cláusula where no es clara - parece innecesario o incompleto. (La razón por la que funciona de la forma en que lo hace se analiza a continuación) –

Respuesta

1

MYSQL devolverá todas las filas con el ItemNumber que comienza con un número que es greater than equal to 0.5 and less than equal to -0.5. Considera todos los números greater >= +/-0.5 as true. Y la cláusula where funciona solo en base a verdadero o falso.

true >= -0.5 > false < 0.5 <= true 

Muy inteligentemente, MySQL considerar todos los >= +/-0.5 número como 1 (verdadero). Se necesita verdadero para valores redondeados que no sean cero.

si se escribe

SELECT * FROM items im WHERE 1; // will return all rows. 
SELECT * FROM items im WHERE 0.5; // will return all rows. 
SELECT * FROM items im WHERE 0.4; // will return nothing. 
SELECT * FROM items im WHERE 1 and 0.2; // will return nothing. 
SELECT * FROM items im WHERE 0.3 or 0.5; // will return all rows. 
0

Su cláusula WHERE está esperando un BOOLEAN, ahora no sé cómo mysql administra varchar numérico, pero creo que mysql puede suponer que la cadena de inicio numérica es equivalente a true. Se puede interpretar la consulta como

SELECT * 
    FROM items im 
    WHERE ItemNumber IS TRUE 
-1

Tal vez usted debe comparar ItemNumber con algo. O tratar de

WHERE ItemNumber NOT NULL 

o algo así

WHERE ItemNumber != '' 
6

Esta es la estrategia de MySQL que ser inteligente y suponiendo que sabe lo que quiere decir (en oposición a hacer lo que se escribe).

Cualquier expresión que se evalúe como distinta de cero se considera verdadera. Aquellos elementos que comienzan con una letra no pueden (implícitamente) convertirse a un número por lo que se considera cero y para "falso". Creo que los artículos que tienen el valor (carácter) '0' también están excluidos.

La siguiente declaración, por ejemplo, estará feliz de eliminar todas las filas de la tabla:

DELETE FROM foobar 
WHERE 42; 

No se puede activar este comportamiento fuera. Ni siquiera en modo ANSI MySQL lanzará una expresión de sintaxis.

+0

Esto también es distinto de cero 'SELECCIONAR * FROM' prueba't donde 0.4; 'pero no se considera como verdadero. – manurajhada

0

MySQL soporta esta cosa booleano que debe suprimirse. Conduce a la confusión y arrojará resultados incorrectos o no evaluados. Ningún otro RDBMS lo admite.Suponga que tiene un procedimiento con un parámetro y se olvida de precisar que, como a continuación

WHERE col 

le proporcione todos los datos y es muy difícil de depurar

Cuestiones relacionadas