Answers:
这是NULL
安全的相等运算符。
像常规=
运算符一样,将两个值进行比较,结果为0
(不相等)或1
(相等);换句话说:'a' <=> 'b'
收益率0
和'a' <=> 'a'
收益率1
。
与常规=
运算符不同,of的值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
<=>
是一个无用的运算符?对?
<=>
取两个操作数,而IS (NOT) NULL
只取一个;很大的不同... =
在这方面,它和它自己一样有用。
IS NULL
和IS NOT NULL
在SQL标准中。<=>
是MySQL特定的扩展。
is not distinct from
操作员一样。想知道MySQL是否可以在该索引上使用索引...
a <=> b
IS NOT(a <=> b)
。
是<=> NULL-safe equal to operator
该运算符执行与=运算符类似的相等比较,但是如果两个操作数均为NULL,则返回1而不是NULL,如果一个操作数为NULL,则返回0而不是NULL。
请参阅此处的文档
样品:
您应该使用IS NOT NULL。(比较运算符=和<>都在表达式的两边都给UNKNOWN带NULL。)
SELECT *
FROM table
WHERE YourColumn IS NOT NULL;
也可以否定空安全相等运算符,但这不是标准的SQL。
SELECT *
FROM table
WHERE NOT (YourColumn <=> NULL);
<=>运算符用于将NULL值与字段进行比较。如果normal =(等于),如果比较值之一为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 <=>用于将NULL值与字段进行比较。如果正常!=或<>(不等于),且比较值之一为NULL,则运算符返回NULL。如果将NOT应用于<=>,则运算符将返回true或false。未应用于<=>运算符与IS NOT NULL相同。
例:-
SELECT NULL != NULL, //--Result is NULL
NOT NULL <=> NULL, //--Result is 0
NULL IS NOT NULL; //--Result is 0
NOT <=>
不是运算符,而是NOT
应用于的结果op1 <=> op2
。
<!=>
运算符
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。如果要检查值是否为空。
Equality运算符(<=>)将NULL视为普通值,因此如果两个值均为NULL则返回1(非NULL),如果其中一个值为NULL则返回0(非NULL):
例如
SELECT NULL <=> NULL -- 1
SELECT TRUE <=> TRUE -- 1
SELECT col1 <=> col2 FROM myTable
<=>
是NULL安全的equal运算符。a <=> b
与写作相同:
CASE
WHEN a IS NULL AND b IS NULL THEN 1 -- both operands null then 1
WHEN a IS NULL OR b IS NULL THEN 0 -- one operand is null then 0
ELSE a = b -- else behave like normal = operator
END
很抱歉,我找不到使用此运算符代替的充分理由AND/OR IS (NOT) NULL
。例如,您的示例WHERE p.name <=> NULL
与相同WHERE p.name IS NULL
。
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 |
spaceship
运营商