今天才发现了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)