181

我正在编写由以前的开发人员编写的代码,并在查询中说,

WHERE p.name <=> NULL

<=>在这个查询中是什么意思?是否等于=?还是语法错误?

但它没有显示任何错误或异常。我已经知道<>=!=MySQL中。

4

10 回答 10

264

TL;博士

这是NULL安全的相等运算符。

和正则=运算符一样,比较两个值,结果要么是0(不等于)要么是1(等于);换句话说:'a' <=> 'b'产量0'a' <=> 'a'产量1

与常规=运算符不同,值 ofNULL没有特殊含义,因此它永远不会NULL作为可能的结果产生;所以:'a' <=> NULL产量0NULL <=> NULL产量1

用处

当两个操作数都可能包含NULL并且您需要在两列之间获得一致的比较结果时,这会很有用。

另一个用例是使用准备好的语句,例如:

... WHERE col_a <=> ? ...

在这里,占位符可以是标量值,也可以是NULL无需更改查询的任何内容。

相关运算符

此外<=>,还有两个其他运算符可用于比较NULL,即IS NULLand 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-21T07:56:08.593 回答
63

<=> 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);
于 2014-02-21T06:41:40.297 回答
30

它是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
于 2014-02-21T06:43:07.443 回答
18

<=>是 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
于 2014-02-21T06:43:58.527 回答
13

<=>NULL 安全的相等运算符。它相当于标准的 SQLis not distinct from运算符。它的行为最好通过真值表来解释:

一个 b a <=> b
1 0 错误的
1 1 真的
1 无效的 错误的*
无效的 无效的 真的*

* 请注意,与其他运算符不同,此运算符永远不会返回未知(由 null 表示)。

于 2014-02-22T09:01:48.717 回答
12

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
于 2014-02-21T06:42:55.063 回答
9

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

于 2014-02-23T01:45:57.633 回答
5

它是 NULL - Safe Equal to 运算符。检查说明

于 2014-02-21T06:42:52.430 回答
1
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 |
于 2016-02-27T10:44:25.187 回答
0

简而言之where col1<=>?,它相当于where col1=? or col1 is null

于 2021-10-28T13:52:42.293 回答