VALUE是IS NOT NULL MySQL的快捷方式吗?

IS !value a shortcut for IS NOT NULL MySQL?

提问人:Fred Phish 提问时间:2/7/2023 最后编辑:Fred Phish 更新时间:2/7/2023 访问量:152

问:

在使用 MySQL 时,我注意到如果我运行

SELECT * FROM table WHERE !value;

返回与以下内容相同的内容

SELECT * FROM table WHERE value IS NOT NULL;

该表为“employees”,列为“MiddleInitial”(字符串)。 因此,我得到了 MiddleInitial 不为 null 的所有员工。

这是恰当的速记还是巧合?我想知道这是否是一种安全的写作方式?我似乎找不到任何关于这方面的信息。

我期待

SELECT * FROM table WHERE !value;

返回所有 null 值。奇怪

SELECT * FROM table WHERE value;

不返回任何内容。

mysql sql 语法 null 简写

评论

1赞 jarlh 2/7/2023
列值数据类型?
1赞 Tim Biegeleisen 2/7/2023
...和样本数据?
0赞 jarlh 2/7/2023
!FALSE返回 1,返回 0,即作为 .并返回 1,并返回 0。!TRUENOT!0!1
1赞 jarlh 2/7/2023
!, 运算符是非标准的 MySQL 扩展。从 MySQL 8.0.17 开始,此运算符已弃用;预计它会在MySQL的未来版本中删除。应将应用程序调整为使用标准 SQL NOT 运算符。

答:

2赞 Joel Coehoorn 2/7/2023 #1

不,不是。

这似乎是因为它正在执行类型强制以强制列中的任何内容为布尔值。 当强制作为布尔谓词时,值将强制转换为,并且大多数非 null 列值将强制为 。但是某些列值(不为 null)也会强制转换为 。NULLfalsetruefalse

您可以在此处查看示例:

https://dbfiddle.uk/ABLUgLex

请注意,最后一个示例缺少该行。另请注意前面的那一行不包括该行,这让我怀疑您的服务器可能设置了用于非标准空处理的选项。0null

下面是一些其他示例:

https://dbfiddle.uk/BNxiujKt

请注意行的处理方式。'1'

评论

0赞 Joel Coehoorn 2/7/2023
哎呀,上次测试后我错过了更新链接。现在已修复此问题,因此更有意义。
1赞 Bill Karwin 2/7/2023 #2

在 SQL 中,与 不同。NULLfalse

否定不是,它仍然是.NULLtrueNULL

mysql> select null;
+------+
| NULL |
+------+
| NULL |
+------+

mysql> select !(null);
+---------+
| !(null) |
+---------+
|    NULL |
+---------+

可以看作是“未知”的值。如果某条信息是未知的,那么如何知道它的反面呢?它不能——相反的情况也是未知的,因为我们不知道我们是从什么开始的。NULL

当在子句条件中使用时,行为或多或少类似于,因为两者都不是严格意义上的。只有条件所在的行才会成为查询结果集的一部分。WHERENULLfalsetruetrue

还有其他值的作用类似于MySQL:false

mysql> select 1 where '';
Empty set (0.01 sec)

mysql> select 1 where 0;
Empty set (0.01 sec)

MySQL有点不标准,因为布尔值和实际上分别与整数值1和0相同(这不是大多数其他品牌的SQL数据库中布尔值的实现方式)。truefalse

这些值不是 ,因此可以否定它们,您可以将它们的对立面视为 。NULLtrue

mysql> select 1 where !0;
+---+
| 1 |
+---+
| 1 |
+---+

mysql> select 1 where !'';
+---+
| 1 |
+---+
| 1 |
+---+

如上所述,该运算符在 MySQL 8.0 中已弃用。它不是标准的 SQL,使用它会使您的代码不如使用更明确的语言(如 或)清晰。!IS NOT NULL<>