GBase 8a空值查询,任意一列为空NULL或某个值的数据行的方法

今天才发现了in的一个用法,在GBase 8a里做了实验,可以让一个值in一组列来实现:任意一列等于值就返回的方法。

需求

查询任意一列为NULL ,或者为一个指定字符串,比如'<ERROR>'的数据行。

我这里用2列做个示例

gbase> select * from t1;
+------+-------+
| id   | name  |
+------+-------+
| NULL | First |
|  222 | NULL  |
|  333 | Third |
+------+-------+
3 rows in set (Elapsed: 00:00:00.00)

普通实现 IS NULL

用多个IS NULL的OR条件来实现,看上去语法明确,很容易理解。

gbase> select * from t1 where id is null or name is null;
+------+-------+
| id   | name  |
+------+-------+
| NULL | First |
|  222 | NULL  |
+------+-------+
2 rows in set (Elapsed: 00:00:00.00)

IN的写法

数值 IN (字段列表) 这个写法,我还是第一次用。注意NULL不等于任何值,如下已经将NULL转成了空字符串''来操作。

gbase> select * from t1 where '' in(nvl(id,''),nvl(name,''));
+------+-------+
| id   | name  |
+------+-------+
| NULL | First |
|  222 | NULL  |
+------+-------+
2 rows in set (Elapsed: 00:00:00.01)

同样的,其它值也是可以的。

gbase> select * from t1 where '222' in(id,name);
+------+------+
| id   | name |
+------+------+
|  222 | NULL |
+------+------+
1 row in set (Elapsed: 00:00:00.00)

gbase> select * from t1 where 'First' in(id,name);
+------+-------+
| id   | name  |
+------+-------+
| NULL | First |
+------+-------+
1 row in set (Elapsed: 00:00:00.01)