我正在编写由以前的开发人员编写的代码,并在查询中说,
WHERE p.name <=> NULL
<=>
在这个查询中是什么意思?是否等于=
?还是语法错误?
但它没有显示任何错误或异常。我已经知道<>
=!=
在MySQL中。
我正在编写由以前的开发人员编写的代码,并在查询中说,
WHERE p.name <=> NULL
<=>
在这个查询中是什么意思?是否等于=
?还是语法错误?
但它没有显示任何错误或异常。我已经知道<>
=!=
在MySQL中。
这是NULL
安全的相等运算符。
和正则=
运算符一样,比较两个值,结果要么是0
(不等于)要么是1
(等于);换句话说:'a' <=> 'b'
产量0
和'a' <=> 'a'
产量1
。
与常规=
运算符不同,值 ofNULL
没有特殊含义,因此它永远不会NULL
作为可能的结果产生;所以:'a' <=> NULL
产量0
和NULL <=> NULL
产量1
。
当两个操作数都可能包含NULL
并且您需要在两列之间获得一致的比较结果时,这会很有用。
另一个用例是使用准备好的语句,例如:
... WHERE col_a <=> ? ...
在这里,占位符可以是标量值,也可以是NULL
无需更改查询的任何内容。
此外<=>
,还有两个其他运算符可用于比较NULL
,即IS NULL
and 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
是<=> NULL-safe equal to operator
此运算符执行与 = 运算符类似的相等比较,但如果两个操作数都为 NULL,则返回 1 而不是 NULL,如果一个操作数为 NULL,则返回 0 而不是 NULL。
有关文档,请参见此处
样本 :
你应该使用 IS NOT NULL。(比较运算符 = 和 <> 在表达式的任一侧都给出了带有 NULL 的 UNKNOWN。)
SELECT *
FROM table
WHERE YourColumn IS NOT NULL;
也可以否定 null 安全相等运算符,但这不是标准 SQL。
SELECT *
FROM table
WHERE NOT (YourColumn <=> NULL);
<=> 运算符用于将 NULL 值与字段进行比较。If normal =(equals) 如果比较值之一为 NULL,则运算符返回 NULL。使用 <=> 运算符返回 true 或 false。<=> 运算符与 IS NULL 相同。
从手册: -
<=>
执行与 = 运算符类似的相等比较,但如果两个操作数都为 NULL,则返回 1 而不是 NULL,如果一个操作数为 NULL,则返回 0 而不是 NULL。
mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
-> 1, 1, 0
mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL;
-> 1, NULL, NULL
编辑:-(虽然很晚才添加一个重要的旁注,但也提到了NOT <=>)
附带说明:-
还有一个点NOT <=>用于将 NULL 值与字段进行比较。如果正常 != 或 <>(不等于)如果比较值之一为 NULL,则运算符返回 NULL。将 NOT 应用于 <=> 运算符将返回 true 或 false。NOT 应用于 <=> 运算符与 IS NOT NULL 相同。
例子:-
SELECT NULL != NULL, //--Result is NULL
NOT NULL <=> NULL, //--Result is 0
NULL IS NOT NULL; //--Result is 0
<=>
是 MySQL 的 null 安全“等于”运算符。 从手册:
NULL 安全相等。此运算符执行与 = 运算符类似的相等比较,但如果两个操作数都为 NULL,则返回 1 而不是 NULL,如果一个操作数为 NULL,则返回 0 而不是 NULL。
mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
-> 1, 1, 0
mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL;
-> 1, NULL, NULL
<=>
是NULL 安全的相等运算符。它相当于标准的 SQLis not distinct from
运算符。它的行为最好通过真值表来解释:
一个 | b | a <=> b |
---|---|---|
1 | 0 | 错误的 |
1 | 1 | 真的 |
1 | 无效的 | 错误的* |
无效的 | 无效的 | 真的* |
* 请注意,与其他运算符不同,此运算符永远不会返回未知(由 null 表示)。
NULL 安全相等。此运算符执行与 = 运算符类似的相等比较,但如果两个操作数都为 NULL,则返回 1 而不是 NULL,如果一个操作数为 NULL,则返回 0 而不是 NULL。
mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
-> 1, 1, 0
mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL;
-> 1, NULL, NULL
它的意义:
当您将 NULL 值与非 NULL 值进行比较时,您将得到 NULL。如果你想检查一个值是否为空。
将 NULL 视为正常值的相等运算符 (<=>),因此如果两个值都为 NULL,则返回 1(非 NULL),如果其中一个值为 NULL,则返回 0(非 NULL):
例如
SELECT NULL <=> NULL -- 1
SELECT TRUE <=> TRUE -- 1
SELECT col1 <=> col2 FROM myTable
从MySQL 文档:
NULL 安全相等。此运算符执行与 = 运算符类似的相等比较,但如果两个操作数都为 NULL,则返回 1 而不是 NULL,如果一个操作数为 NULL,则返回 0 而不是 NULL。
使用运算符的示例<=>
是:
SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
哪个会返回:
1, 1, 0
常规运算符的一个示例=
是:
SELECT 1 = 1, NULL = NULL, 1 = NULL;
哪个会返回:
1, NULL, NULL
运算符与<=>
运算符非常相似=
,除了<=>
永远不会返回NULL
它是 NULL - Safe Equal to 运算符。检查说明。
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 |
简而言之where col1<=>?
,它相当于where col1=? or col1 is null