我正在编写前一位开发人员编写的代码,在一个查询中,它说,

WHERE p.name <=> NULL

<=>在这个问题中是什么意思?它等于=吗?还是语法错误?

但它没有显示任何错误或例外.我已经知道<>=!=/MySQL.

推荐答案

TL;博士

NULL safe equal号接线员.

与常规=运算符一样,比较两个值,结果为0(不相等)或1(相等);换句话说:'a' <=> 'b'得到0'a' <=> 'a'得到1.

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

有用性

当两个操作数都可能包含NULL,并且两列之间需要一致的比较结果时,这可能非常有用.

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

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

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

相关操作员

除了<=>,还有另外两个操作符可以用来与NULL进行比较,即IS NULLIS 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

Mysql相关问答推荐

运行简单查询时Prisma预准备语句错误

在MySQL CLI中,是否有自动完成过程的方法?

MySQL全文索引和不区分大小写搜索带来的挑战

使用 awk 重写 maxscale 过滤器

如何通过SQL来计算到达特定值的行的数量

在 MYSQL 8 中的 JSON 字段上的 SELECT 中返回所有键及其数组项

Mysql时间序列数据的最小值和最大值

for each 查询设置 MySQL @@session.time_zone 而不是 CONVERT_TZ 的缺点?

MySQL CHECK 约束以确保记录不使用自动增量 ID 引用自身?

当用它的别名替换 (MAX(s.salary) - MIN(s.salary) 它将不起作用.. 为什么?

当查询 MySQL 的 goroutine 过多时,Go 会出现panic

查询给出错误时的 mySQL Group_Concat 和 Case

为什么从我的 SQL 查询中删除 BINARY 函数调用会如此显着地改变查询计划?

SQL 中的双杠 (||) 是什么意思?

获取Count(*)占GROUP BY中所有项目数的百分比

使用 PHP 和 MySQL 存储和显示 unicode 字符串 (हिन्दी)

在 MySQL 中找不到 outfile 创建的文件

如何从两个不同的日期获得年份差异?

从 MySQL 中的日、月、年字段创建日期

如何允许 django 管理员将字段设置为 NULL?