我正在编写由以前的开发人员编写的代码,在查询中它说,
WHERE p.name <=> NULL这个查询中的<=>是什么意思?它是否等同于=?或者是语法错误?
但是它没有显示任何错误或异常。我已经知道MySQL中的<> = !=。
发布于 2014-02-21 15:56:09
TL;DR
这是NULL safe equal运算符。
与常规的=运算符一样,比较两个值,结果要么是0 (不等于),要么是1 (等于);换句话说:'a' <=> 'b'产生0,'a' <=> 'a'产生1。
与常规的=运算符不同,NULL的值没有特殊含义,因此它永远不会生成NULL作为可能的结果;因此:'a' <=> NULL生成0,NULL <=> NULL生成1。
有用性
当两个操作数都可能包含NULL,并且需要两列之间的比较结果一致时,这会很有用。
另一个用例是使用预准备语句,例如:
... WHERE col_a <=> ? ...在这里,占位符可以是标量值,也可以是NULL,而不必更改查询的任何内容。
相关操作符
除了<=>之外,还有另外两个运算符可用于与NULL进行比较,即IS NULL和IS NOT NULL;它们是ANSI标准的一部分,因此在其他数据库上也受支持,这与特定于MySQL的<=>不同。
你可以把它们看作是MySQL的<=>的专门化。
'a' IS NULL ==> 'a' <=> NULL
'a' IS NOT NULL ==> NOT('a' <=> NULL)基于此,您的特定查询(片段)可以转换为更可移植的:
WHERE p.name IS NULL支持
SQL:2003标准为此引入了一个谓词,其工作方式与MySQL的<=>操作符完全相同,形式如下:
IS [NOT] DISTINCT FROM 以下是普遍支持的,但相对复杂:
CASE WHEN (a = b) or (a IS NULL AND b IS NULL)
THEN 1
ELSE 0
END = 1发布于 2014-02-21 14:42:52
它是空安全的等于运算符。检查description。
发布于 2016-02-27 18:44:25
mysql> SELECT * FROM t JOIN t2 WHERE t2.ids = t.ids;
+----+------+----+------+
| id | ids | id | ids |
+----+------+----+------+
| 1 | 1 | 1 | 1 |
| 2 | 2 | 2 | 2 |
| 5 | 6 | 5 | 6 |
| 6 | 7 | 6 | 7 |
+----+------+----+------+
4 rows in set (0.00 sec)
mysql> SELECT * FROM t JOIN t2 WHERE t2.ids <=> t.ids;
+----+------+----+------+
| id | ids | id | ids |
+----+------+----+------+
| 1 | 1 | 1 | 1 |
| 2 | 2 | 2 | 2 |
| 3 | NULL | 3 | NULL |
| 4 | NULL | 3 | NULL |
| 3 | NULL | 4 | NULL |
| 4 | NULL | 4 | NULL |
| 5 | 6 | 5 | 6 |
| 6 | 7 | 6 | 7 |https://stackoverflow.com/questions/21927117
复制相似问题