GBase 8a通过<=>安全等于操作符,解决包含null值的等于操作

在SQL标准中, null和任何值都不相等,包括null自己。在GBase 8a中,可以通过安全等于操作符<=>对null也可以进行相等判断。一般用于join等关联查询场景。

操作符说明

a<=>b

这个操作符像“=”操作符一样执行相等比较,但在下面 2 种情况下,获得的结果与“=”不同:

  1. 如果所有的操作数都是 NULL,那么返回的是 1 而不是 NULL。
  2. 如果有且只有一个操作数是 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)