5

我有一个有趣的结果,但不明白为什么。

SELECT * 
  FROM items im
 WHERE ItemNumber

ItemNumber是一个varchar(50)

此查询的结果是返回所有ItemNumber以数字开头的项目。如果ItemNumber以字母开头,则将其排除在外。

有没有人解释为什么查询以这种方式交互?

4

5 回答 5

6

这是 MySQL 的聪明策略,并假设它知道你的意思(而不是做你写的)。

任何计算结果为非零的表达式都被认为是真的。那些以字母开头的项目不能(隐含地)转换为数字,因此它被认为是零,因此是“假”。我认为具有(字符)值'0'的项目也被排除在外。

例如,以下语句将愉快地删除表中的所有行:

DELETE FROM foobar
WHERE 42;

您无法关闭此行为。即使在 ANSI 模式下,MySQL 也不会抛出语法表达式。

于 2012-07-12T13:41:45.930 回答
1

MYSQL 将返回 ItemNumber 以数字开头的所有行greater than equal to 0.5 and less than equal to -0.5。它考虑所有数字greater >= +/-0.5 as true。Andwhere子句仅基于 true 或 false 起作用。

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

非常聪明,mysql将所有>= +/-0.5数字视为 1(真)。对于四舍五入的非零值,它是true

如果你写

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.
于 2012-07-12T13:45:22.643 回答
0

您的 WHERE 子句正在等待 BOOLEAN,我现在不知道 mysql 如何管理数字 varchar,但我认为 mysql 可能会假设数字起始字符串等于 true。它可以将查询解释为

SELECT * 
  FROM items im
  WHERE ItemNumber IS TRUE
于 2012-07-12T13:37:54.263 回答
0

MySQL 支持这个应该被删除的布尔值。它会导致混乱,并会返回错误/意外的结果。没有其他 RDBMS 支持这一点。假设您有一个带有参数的过程,但您忘记指定它,如下所示

WHERE col 

它将返回所有数据并且很难调试

于 2012-07-12T13:47:02.777 回答
-1

也许您应该将 ItemNumber 与某些东西进行比较。或者试试

WHERE ItemNumber NOT NULL

或类似的东西

WHERE ItemNumber != ''
于 2012-07-12T13:38:24.593 回答