Suponiendo que tenemos una tabla con el siguiente esquema:
create table Test(id integer, title varchar(100)); insert into Test(id, title) values(1, "Hello"); insert into Test(id, title) values(20, "Hi");La consulta no típica en ese caso sería:
select * from Test where id= 20 < 2 AND SLEEP(1000000000) ; -- sleep is being executed select * from Test where id= 20 > 2 AND SLEEP(1000000000) ; -- sleep is not being executed and nothing is going to be display select * from Test where id = 20 > 0; -- shows only one record , where id=20 /// "Hi" select * from Test where id = 20 > -1; -- shows whole table structureAntes de este ejemplo, mi pregunta es qué está pasando en ese momento específico de comparación. Por qué actúa diferente si id=20 > 0 que id = 20 > -1.
Esta es la consulta en cuestión:
SELECT * FROM Test WHERE id = 20 > -1; La razón por la que lo anterior devuelve la tabla completa es que la cláusula WHERE en realidad contiene una comparación de rango y se evalúa de la siguiente manera:
SELECT * FROM Test WHERE (id = 20) > -1; La expresión (id = 20) se evaluará como 1 , si es verdadera, o 0 , si es falsa. En cualquier caso, tanto el cero como el uno siempre serán mayores que -1 , por lo que esta consulta siempre devolverá todos los registros.