zzl*_*ani 154 mysql sql operators spaceship-operator
我正在研究由以前的开发人员编写的代码,并在查询中说,
WHERE p.name <=> NULL
Run Code Online (Sandbox Code Playgroud)
<=>这个查询意味着什么?它等于=什么?或者是语法错误?
但它没有显示任何错误或例外.我已经知道了<>= !=在MySQL中.
Ja͢*_*͢ck 223
=运营商的相似性与常规=运算符一样,比较两个值,结果是0(不相等)或1(相等); 换句话说:'a' <=> 'b'收益率0和'a' <=> 'a'收益率1.
=运营商的区别与常规=算子不同,值NULL不具有特殊含义,因此它不会产生NULL可能的结果; 所以:'a' <=> NULL产量0和NULL <=> NULL产量1.
相反=,'a' = NULL产量NULL甚至NULL = NULL产量NULL; 顺便说一下,MySQL中的几乎所有运算符和函数都以这种方式工作,因为比较NULL基本上是未定义的.
这对于两个操作数可能包含NULL并且您需要两列之间的一致比较结果非常有用.
另一个用例是使用预准备语句,例如:
... WHERE col_a <=> ? ...
Run Code Online (Sandbox Code Playgroud)
这里,占位符可以是标量值,也可以NULL不必更改查询的任何内容.
此外<=>还有可以用来比较其他两家运营商NULL,分别是IS NULL和IS NOT NULL; 它们是ANSI标准的一部分,因此支持其他数据库,这与<=>MySQL特定的不同.
您可以将它们视为MySQL的特殊化<=>:
'a' IS NULL ==> 'a' <=> NULL
'a' IS NOT NULL ==> NOT('a' <=> NULL)
Run Code Online (Sandbox Code Playgroud)
基于此,您的特定查询(片段)可以转换为更可移植的:
WHERE p.name IS NULL
Run Code Online (Sandbox Code Playgroud)
Dri*_*eña 55
是<=> NULL-safe equal to operator
此运算符执行与=运算符类似的相等比较,但如果两个操作数均为NULL,则返回1而不是NULL;如果一个操作数为NULL,则返回0而不是NULL.
请参阅此处获取文档
样品:
你应该使用IS NOT NULL.(比较运算符=和<>都在表达式的任一侧为UNKNOWN提供NULL.)
SELECT *
FROM table
WHERE YourColumn IS NOT NULL;
Run Code Online (Sandbox Code Playgroud)
也可以否定null安全等式运算符,但这不是标准SQL.
SELECT *
FROM table
WHERE NOT (YourColumn <=> NULL);
Run Code Online (Sandbox Code Playgroud)
Rah*_*thi 24
<=>运算符用于将NULL值与字段进行比较.如果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
Run Code Online (Sandbox Code Playgroud)
编辑: - (虽然很晚添加一个重要侧面说明一提不<=>以及)
在旁注: -
还有一点NOT <=>用于将NULL值与字段进行比较.如果正常!=或<>(不等于)如果其中一个比较值为NULL,则运算符返回NULL.如果未应用于<=>运算符,则返回true或false.不适用于<=>运算符与IS NOT NULL相同.
例:-
SELECT NULL != NULL, //--Result is NULL
NOT NULL <=> NULL, //--Result is 0
NULL IS NOT NULL; //--Result is 0
Run Code Online (Sandbox Code Playgroud)
eli*_*ide 18
<=>是MySQL的零安全"等于"运算符. 从手册:
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
Run Code Online (Sandbox Code Playgroud)
Dim*_*rab 11
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
Run Code Online (Sandbox Code Playgroud)
它的意义:
将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
Run Code Online (Sandbox Code Playgroud)
Sal*_*n A 10
<=>是NULL安全的等于运算符.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
Run Code Online (Sandbox Code Playgroud)
抱歉,我找不到使用此运算符的一个很好的理由而不是AND/OR IS (NOT) NULL.例如,您的示例WHERE p.name <=> NULL与WHERE p.name IS NULL.
从MySQL文档:
NULL安全相等.此运算符执行与=运算符类似的相等比较,但如果两个操作数均为NULL,则返回1而不是NULL;如果一个操作数为NULL,则返回0而不是NULL.
使用<=>运算符的示例是:
SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
Run Code Online (Sandbox Code Playgroud)
哪个会回归:
1, 1, 0
Run Code Online (Sandbox Code Playgroud)
常规=运营商的一个例子是:
SELECT 1 = 1, NULL = NULL, 1 = NULL;
Run Code Online (Sandbox Code Playgroud)
哪个会回归:
1, NULL, NULL
Run Code Online (Sandbox Code Playgroud)
该<=>操作是非常相似的=操作,除了<=>将永远不会返回NULL