一天的工作从填坑开始
2016-05-13 10:27
477 查看
由于项目的需要,需要把用户编号和用户微信号在公众号下的唯一标识(openId)进行绑定,于是乎写了一段SQL用于更新用户表的
假设表名为
在最初的时候,
当
在http://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements005.htm与对
A condition that evaluates to
为了解决这个问题,可以将SQL作如下修改,增加null的判断:
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
UNKNOWNacts almost like
FALSE. For example, a
SELECTstatement with a condition in the
WHEREclause that evaluates to
UNKNOWNreturns no rows. However, a condition evaluating to
UNKNOWNdiffers from
FALSEin that further operations on an
UNKNOWNcondition evaluation will evaluate to
UNKNOWN. Thus,
NOT FALSEevaluates to
TRUE, but
NOT UNKNOWNevaluates to UNKNOWN.
Condition | Value of A | Evaluation |
---|---|---|
a IS NULL | 10 | FALSE |
a IS NOT NULL | 10 | TRUE |
a IS NULL | NULL | TRUE |
a IS NOT NULL | NULL | FALSE |
a = NULL | 10 | UNKNOWN |
a != NULL | 10 | UNKNOWN |
a = NULL | NULL | UNKNOWN |
a != NULL | NULL | UNKNOWN |
a = 10 | NULL | UNKNOWN |
a != 10 | NULL | UNKNOWN |
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;
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 基于 Red Hat 的发行版 Oracle Linux 正式发布Oracle Linux 7.1
- SQL中的三值逻辑
- SQL Server 作业批量停止
- 结束SQL阻塞的进程
- 动态生成SQL Server视图作业
- Oracle Containers for J2EE远程安全漏洞(CVE-2014-0413)
- Oracle 10g R2不能使用EM的问题
- SQL Server 语句操纵数据库
- 表空间操作
- PreparedStatement中in子句的处理
- SQL(结构化查询语句)
- VMware下RedHat4.8_64位安装Oracle 10g RAC--简略脚本
- oracle sql日期比较
- 基于 Red Hat 的发行版 Oracle Linux 正式发布Oracle Linux 7.1
- OS block size和Oracle block size,查找OS Blocksize的方法