您的位置:首页 > 数据库 > Oracle

一天的工作从填坑开始

2016-05-13 10:27 477 查看
由于项目的需要,需要把用户编号和用户微信号在公众号下的唯一标识(openId)进行绑定,于是乎写了一段SQL用于更新用户表的
openId
,逻辑很简单,如果用户已经绑定则修改,没有绑定则添加。

假设表名为
USER_WECHAT_BIND
,其中有两列,分别为userId和openId,在SQL中有这么一段:

select openId into v_tmpId from USER_WECHAT_BIND where userId = v_userId;
if v_tmpId <> v_opneId then
update USER_WECHAT_BIND set openId = v_openId where userId = v_userId;
end if;


在最初的时候,
userId
openId
都是不允许空值的,所以这段SQL执行正常,也能达到预期更新的效果,随着业务的变化,后来将表结构进行了修改,
openId
允许为空,在测试的时候发现,当
openId
为空的记录执行这段SQL的时候并不能按照预期进行修改操作。

openId
为空时,那么v_tmpId为空,则
v_tmpId <> v_opneId
的结果为
UNKNOWN
,可以认为是条件不成立,所以下面的更新语句就不会执行。

http://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements005.htm与对
null
的描述。

A condition that evaluates to
UNKNOWN
acts almost like
FALSE
. For example, a
SELECT
statement with a condition in the
WHERE
clause that evaluates to
UNKNOWN
returns no rows. However, a condition evaluating to
UNKNOWN
differs from
FALSE
in that further operations on an
UNKNOWN
condition evaluation will evaluate to
UNKNOWN
. Thus,
NOT FALSE
evaluates to
TRUE
, but
NOT UNKNOWN
evaluates to UNKNOWN.

ConditionValue of AEvaluation
a IS NULL10FALSE
a IS NOT NULL10TRUE
a IS NULLNULLTRUE
a IS NOT NULLNULLFALSE
a = NULL10UNKNOWN
a != NULL10UNKNOWN
a = NULLNULLUNKNOWN
a != NULLNULLUNKNOWN
a = 10NULLUNKNOWN
a != 10NULLUNKNOWN
为了解决这个问题,可以将SQL作如下修改,增加null的判断:

select openId into v_tmpId from USER_WECHAT_BIND where userId = v_userId;
if v_tmpId is null or v_tmpId <> v_opneId then
update USER_WECHAT_BIND set openId = v_openId where userId = v_userId;
end if;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  sql null oracle