繁体   English   中英

不带运算符的 where 子句

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM