[英]Where clause without operator
在尝试回答这个问题时,我发现了一种我认为错误的语法
select * from table where area and block
我尝试了一个 sqlFiddle,发现它是有效的。
但是我一直无法找到它是如何工作的(我找到的所有文档都包括运算符)......
在这里尝试了 sql 小提琴
它似乎为可空的 int 字段“消除”了 null 和 0 结果,或为不可空的 int 字段“消除”了 0 结果。
看起来它也保留了 varchar 值......其中包含 int 值(但不是“0”)!
即使我认为使用这种语法(根本)不是一个好主意,如果有人对如何管理它有任何解释,我将不胜感激......
来自Logical Operators的 MySQL 文档:
MySQL 将任何非零、非 NULL 值评估为 TRUE。 例如,以下语句都评估为 TRUE:
mysql> SELECT 10 IS TRUE;<br/>
-> 1
mysql> SELECT -10 IS TRUE;<br/>
-> 1
mysql> SELECT 'string' IS NOT NULL;<br/>
-> 1
似乎它将任何非零int
字段评估为TRUE
。 此外,任何包含数字的varchar
字段都会被视为数字字段。 我在您的小提琴中检查了'0'
的varchar
字段未评估为TRUE
。 并且任何无法转换为数字的varchar
字段都不会评估为TRUE
除非它是IS NOT NULL
表达式的一部分。 因此:
mysql> SELECT 'string' IS TRUE;<br/>
-> 0
通过测试您的小提琴,我发现以下 2 个查询的行为相同:
select * from test where ttt;
select * from test where ttt IS TRUE;
我没有任何确切的证据或源代码,但它似乎MySQL实际是在上面,即使可以省略它的第一个查询中使用的运营商。
为 Tim Biegeleisen 的答案添加一些说明......
在WHERE
子句中,MySQL 将表达式计算为布尔值。 如果该表达式的结果为 TRUE,则返回该行。 否则,将排除该行。
中相应的表达WHERE
子句不要求具有比较运算符。 但比较运算符/操作(例如, foo = 'x'
)的结果是布尔值很方便。
在 MySQL 中,布尔值TRUE 表示为整数值1
, FALSE 表示为整数值0
,而 NULL (当然)是NULL
。 我们可以观察到这种行为,例如
SELECT TRUE + TRUE AS c1, FALSE AS c2
返回:
c1 c2
---- ----
2 0
在 MySQL 中,有很多表达式可以在布尔上下文中进行计算。 (我想不出一个不可能的表达式,尽管 MySQL 似乎对返回 DECIMAL 值的表达式感到不安。)
Tim 的回答表明 MySQL 正在添加一个IS TRUE
比较,并且这两个语句被等效地评估:
SELECT * FROM test WHERE ttt;
SELECT * FROM test WHERE ttt IS TRUE;
这并不太远,因为在很多情况下,这些查询确实返回相同的结果。 但这并不是最好的解释,因为实际上这两个陈述的评估方式不同; 这些在某些极端情况下会返回不同的结果。 作为演示,请考虑:
CREATE TABLE test (ttt DECIMAL(18,9) PRIMARY KEY);
INSERT INTO test (ttt) VALUES (0.48);
一个语句返回一行,另一个不返回。 SQL小提琴在这里:http://sqlfiddle.com/#!9/63960/1
实际上是WHERE
子句要求将表达式计算为布尔值。 这不包括表达式计算结果不为 TRUE 的行。
foo IS TRUE
是针对布尔值对表达式foo
的测试。 参考: https : //dev.mysql.com/doc/refman/5.6/en/comparison-operators.html#operator_is
我们希望这些是相同的,但正如前面所演示的, IS TRUE
测试可以给出与WHERE
子句中表达式的评估不同的结果。
在WHERE
子句中,表达式被评估为布尔值。
在布尔上下文中评估整数值相对容易...... NULL 是(当然)NULL,整数值0
是 FALSE,任何其他非零整数值是TRUE
。
十进制/数字值的评估有点松散,值为 foo,其中-0.5 > foo > 0.5
,在布尔上下文中,这些值不会评估为 TRUE。 我们通过构建一个表达式来使转换显式,而不是默认为 MySQL 的隐式舍入行为来解决这个问题:
SELECT * FROM test WHERE CEIL(ABS(ttt));
甚至可以在布尔上下文中评估字符串。 MySQL 隐式地将字符串转换为数字。 然后遵循与数值相同的规则。
与 WHERE 子句中foo
的求值更匹配的 SQL 表达式是:
ABS(SIGN(ROUND(t.foo+0,0))) AS `ASR foo+0`
(我并不是说这实际上是 MySQL 正在执行的操作;我只是说这个表达式为我们提供了一个与 MySQL 执行的操作更匹配的返回。)
对于 foo 的各种字符值:
foo foo+0 foo IS TRUE ASR foo+0 WHERE foo
------ ------ ----------- --------- ---------
7x 7 1 1 yes
-2.4 -2.4 1 1 yes
0.0123 0.0123 1 0 no
0 0 0 0 no
(NULL) (NULL) 0 (NULL) no
它基本上显示所有数据库结果,无需任何过滤。 如果使用了某个运算符,则查询将在该运算符条件下运行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.