一天的工作从填坑开始

由于项目的需要,需要把用户编号和用户微信号在公众号下的唯一标识(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;

在最初的时候,userIdopenId都是不允许空值的,所以这段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;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值