当SQLServer判断不等于遇到null的时候

在做定时同步的时候,经常会做比较判断,常用的就是比较不等于就执行同步,但是在使用<>和!=的时候,是不能用来判断是否有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 ) 
       )

发布了64 篇原创文章 · 获赞 34 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/svygh123/article/details/101249629