在做定时同步的时候,经常会做比较判断,常用的就是比较不等于就执行同步,但是在使用<>和!=的时候,是不能用来判断是否有null的情况的,<>和!=定义为:比较两个表达式。 当使用此运算符比较非空表达式时,如果左操作数不等于右操作数,则结果为 TRUE。 否则,结果为 FALSE
以下记录了实际发生的情况:
有两个表,一个原始表T_Person,一个需要从原始表同步的表T_SyncPerson,当工号一样且密码不一样时就需要同步,因此最核心的就是写出密码不相等SQL语句
create table T_Person(
code varchar(20),
name varchar(20),
pwd varchar(18),
state varchar(4)
)
create table T_SyncPerson(
code varchar(20),
name varchar(20),
pwd varchar(18),
state varchar(4)
)
insert into T_Person(code,name,pwd,state) values('02219666','风徐来','1234','禁用')
insert into T_Person(code,name,pwd,state) values('02219666','风徐来','1111','启用')
insert into T_SyncPerson(code,name,pwd,state) values('02219666','风徐来',null,'启用')
表中的数据有如下
最初的查询密码不同的语句如下
SELECT p.*
FROM T_Person p,
T_SyncPerson s
WHERE p.code = s.code
AND p.state = '启用'
AND s.state = '启用'
AND p.pwd <> s.pwd
执行后
没有数据
因此在比较的时候,遇到有null值需要特别注意,当然在设计表的时候,尽可能的不要使用null,可以用一个默认值代替null,null值代表的是未知数
最后修改的SQL语句如下
SELECT p.*
FROM T_Person p,
T_SyncPerson s
WHERE p.code = s.code
AND p.state = '启用'
AND s.state = '启用'
-- AND p.pwd <> s.pwd
AND (
( p.pwd IS NULL AND s.pwd IS NOT NULL )
OR ( p.pwd IS NOT NULL AND s.pwd IS NULL )
OR ( p.pwd <> s.pwd )
)