在oracle数据库中,空值是一个特殊的。比如要查询出一个表中,某个字段为空或者不为空的数据,不能直接用=或者<>,要使用is null或者is not null。
以上可以说是一个常识性问题,一般都不会犯。不过,下面要说的问题,可能会被大多数人忽略:
背景
比如,在权限系统中,根据角色ID,要找出具有这个角色的用户和不具有这个角色的用户。所以,这里相关的表有fyk_user(用户表)、fyk_user_role(用户和角色的关联关系表)。
问题分析
先来看下不带条件输出的结果,所有的用户共有11个,其中只有两个用户和角色关联了。
如果现在我需要找出没有关联到角色ID为1的所以用户,以便给他们赋值该角色。那么我所期望的应该是找出9个用户(3~11)
,所以加上条件:where ur.role_id <> ‘1’
结果是一条数据也查不出来。其实,这里就犯了一开始说的那种错误,空值的比较,是不能用=或者!=的。
解决方法
在条件上,在加上空值的判断:where ur.role_id <> ‘1’ or ur.role_id is null