我正在编写前一位开发人员编写的代码,在一个查询中,它说,
WHERE p.name <=> NULL
<=>
在这个问题中是什么意思?它等于=
吗?还是语法错误?
但它没有显示任何错误或例外.我已经知道<>
=!=
/MySQL.
我正在编写前一位开发人员编写的代码,在一个查询中,它说,
WHERE p.name <=> NULL
<=>
在这个问题中是什么意思?它等于=
吗?还是语法错误?
但它没有显示任何错误或例外.我已经知道<>
=!=
/MySQL.
是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