在SQL标准中, null和任何值都不相等,包括null自己。在GBase 8a中,可以通过安全等于操作符<=>对null也可以进行相等判断。一般用于join等关联查询场景。
目录导航
操作符说明
a<=>b
这个操作符像“=”操作符一样执行相等比较,但在下面 2 种情况下,获得的结果与“=”不同:
- 如果所有的操作数都是 NULL,那么返回的是 1 而不是 NULL。
- 如果有且只有一个操作数是 NULL,那么返回的是 0 而不是 NULL
样例
直接判断,可以看到null虽然不等于其它值了,但null <=> null是返回true的。
gbase> select 1<=>1,1<=>null,null<=>1,null<=>null;
+-------+----------+----------+-------------+
| 1<=>1 | 1<=>null | null<=>1 | null<=>null |
+-------+----------+----------+-------------+
| 1 | 0 | 0 | 1 |
+-------+----------+----------+-------------+
1 row in set (Elapsed: 00:00:00.00)
如下是关联查询的例子,由于原始数据里包含了null值,对应是不会被关联上的。
gbase> select * from testnull;
+------+-------+
| id | name |
+------+-------+
| 1 | First |
| 2 | NULL |
+------+-------+
2 rows in set (Elapsed: 00:00:00.01)
gbase> select * from testnull2;
+-------+
| name |
+-------+
| NULL |
| First |
+-------+
2 rows in set (Elapsed: 00:00:00.01)
gbase> select a.* from testnull a inner join testnull2 b on a.name = b.name;
+------+-------+
| id | name |
+------+-------+
| 1 | First |
+------+-------+
1 row in set (Elapsed: 00:00:00.03)
但如果用了 <=>安全等于,则可以返回期望的值。
gbase> select a.* from testnull a inner join testnull2 b on a.name <=> b.name;
+------+-------+
| id | name |
+------+-------+
| 1 | First |
| 2 | NULL |
+------+-------+
2 rows in set (Elapsed: 00:00:00.07)