NULL 设下的陷阱

NULL表示unknown,不确定值,所以任何值(包括null值)和NULL值比较都是不可知的,在on子句,where子句,Merge或case的when子句中,任何值和null比较的结果都是false,这就是NULL设下的陷阱,我被坑过。

有一次,我使用Merge同步数据,由于target表中存在null值,虽然在source表中对null值做过处理,但是忽略了target表中的null值,导致数据merge失败。

step1,创建示例数据

--create source table
create table dbo.dt_source
(
id int null,
code int null
)
on [primary]
with(data_compression=page)

--create target table
create table dbo.dt_target
(
id int null,
code int null
)
on [primary]
with(data_compression=page)

step2,插入示例数据

示例数据中,Source表和Target表中都存在null值,不管是在Source表,还是在Target表,都要避免和null值进行比较。

--insert data into table
insert into dbo.dt_source(id,code)
values(1,1),(2,2),(3,null)

insert into dbo.dt_target(id,code)
values(1,1),(2,null)

step3,错误写法:只处理Source表中的null,而忽略Target表中的null

-- -1 stand for unknwon value
merge dbo.dt_target t
using dbo.dt_source s
    on t.id=s.id
when matched and( t.code<>isnull(s.code,-1))
    then update
        set t.code=s.code
when not matched
    then insert(id,code)
    values(s.id,s.code);

查看Target和Srouce表中的数据,数据不同步,不同步的原因是when matched子句之后的and 条件, t.code中存在null值,null值和任何值(包括null值)比较的结果都是unknown,在when子句中视为false。

正确写法1,不管是在target表,还是在source表,只要存在null值,必须进行处理,避免出现和null进行比较的情况。

处理的方式是使用一个值来表示unknwon,如果ID列有效值不可能是负值,那么可以使用-1来代替unknown。因为-1和-1 是相等的,逻辑上就将null值和null值视为相同。

-- -1 stand for unknwon value
merge dbo.dt_target t
using dbo.dt_source s
    on t.id=s.id
when matched and( isnull(t.code,-1)<>isnull(s.code,-1))
    then update
        set t.code=s.code
when not matched
    then insert(id,code)
    values(s.id,s.code);

正确写法2,在条件子句中,使用is null或 is not null来处理null值。

Tsql 使用is null和is not null来确实是,不是 null。 null is null 的逻辑值是true,other_value is null 为false, other_value is not null 为true。

merge dbo.dt_target t
using dbo.dt_source s
    on t.id=s.id
when matched and( t.code<>s.code or t.code is null or s.code is null)
    then update
        set t.code=s.code
when not matched
    then insert(id,code)
    values(s.id,s.code);
时间: 2024-10-10 05:38:42

NULL 设下的陷阱的相关文章

Qt入门之小心read()给你设下的陷阱

最近帮学长写了个Qt Tcpsocket客户端的应用程序,被一个问题困扰了许久.因为以前没有用Qt 写过socket的客户端程序 加上时间比较紧,都没能好好的查看些资料就急忙的写代码,看了一些别人的代码,差不多都是相同的,但是我就出现了收数据 不全的问题.. 最后查出原因是我在接受服务器端的数据时使用了read()这个函数,接收的是个结构体,这里顺便说下怎么在Qt 下收发结构体 发: clientsocket->write((char *)&CardInfo, sizeof(CardInfo

总结一下连日来在MAC下被Python3设下的坑

当时的情况:mac下自带python2, 1.安装pyhon3: 首次从官网下载了安装包安装,安装目录在/Library/Frameworks/Python.framework/Versions/3.6/python/--下,后用pip3安装的包也在这个里面(site-package), 于是卸载了,使用homebrew安装,安装目录改在/usr/local/lib下 但同样无论如何也没能在/usr/local/bin生成环境变量,无论直接使用命令,原因:没有开启sip最高权限. 折腾了一天,选

T-SQL not in 遇到 null 暗含的陷阱

下面有两个T-SQL,乍看之下以为是等效的,实际却不是这样 SELECT orderid1 , LocalCost , supplyGoodsName , buyersgoodsid , JSitId , GSitId FROM csc_result WITH ( NOLOCK ) WHERE [level] > 0 AND orderid1 LIKE '618464266%' AND ( supplygoodsid NOT IN ( 1085317, 1112957 ) ) SELECT or

NULL的陷阱:Merge

NULL表示unknown,不确定值,所以任何值(包括null值)和NULL值比较都是不可知的,在on子句,where子句,Merge或case的when子句中,任何值和null比较的结果都是false,这就是NULL设下的陷阱,我被坑过. 有一次,我使用Merge同步数据,由于target表中存在null值,虽然在source表中对null值做过处理,但是忽略了target表中的null值,导致数据merge失败. step1,创建示例数据 --create source tablecreat

tyvj 1399

P1399尾声-怪盗基德的逃离 未递交 标签:怪盗基德 VS OIBH[显示标签] 背景 怪盗基德第四次拿着战利品信心满满地离开了OIBH总部,一路上大摇大摆,好不嚣张.OIBH的人看不下去又没办法,打算作罢,可是有一天……当当当当……当OIBH总部的吃饭铃声响起的时候,所有正在埋头工作的大牛们都以迅雷不及掩耳盗铃之势向食堂冲去.食堂的大门顿时被人群塞的鼓鼓的(可怜ing...)当大牛们正在全力消灭由水稻演变而来的那东西时,突然走进来一个玉树临风英俊潇洒人见人爱花见花开啤酒见啤酒盖开的大帅哥(啊

禅与摩托车维修艺术

[作者简介]: 罗伯特·M·波西格(Robert M. Pirsig),1928年生于美国明尼苏达州双子城.15岁进入明尼苏达大学主修化学,后又学习哲学,之后在该校攻读传播学硕士:他曾到印度伯纳雷斯印度大学学习东方哲学,并担任修辞学教授.在追求真理的过程中,因为西方倡导的二元对立与二分法带来的分裂而困扰不已,因而一直试图寻找支离破碎的文化的整合之道,并试图建立自己“metaphysics of quality”的理论架构.不停地思考这些问题使他长期饱受折磨和束缚.1961年他被诊断为偏执型精神分

商丘市高科影像金属照片凤凰网

商丘金属照片陷阱没有 馅饼大把 ,高科影像金属照片;在市场经济时代的今天,大批创业者都蠢蠢欲动,我国的连锁加盟经营处于高速发展阶段,加盟连锁可以省去独自创业的很多繁杂问题,商丘市高科创新科技发展研究,但机会从来与风险并存,投资者既可能从连锁加盟中发掘出令人惊喜的金矿,也可能掉进别有用心的人设下的陷阱.商丘高科提醒广大创业者:投资加盟有风险,加盟项目要谨慎,一定要选择可信的项目与公司,共创财富神话,金生比特币金属照片! 产品独特才能抢占市场 商丘金属照片工艺技术精湛,独树一帜.每件产品都是时尚个性

电商实时交易风控系统

1.课程名称 2.课程目标 1.了解电子商务交易的风险点 2.了解电子商务交易中风险点的处理策略 3.利用Storm技术开发基于规则判定的风控系统 4.掌握企业中风控系统的一般架构和业务流程 3.背景知识 3.1.信用卡的交易风险及常见策略 3.1.1.用户逾期风险控制 用户主动.被动对正常消费的金额产生逾期 通过滞纳金进行处理 3.1.2.虚假交易风险控制 3.1.2.1.配合商家进行虚假交易 通过中介公司.皮包公司,在该机构虚假下单,扣除一些的返点. 3.1.2.2.找朋友刷单刷卡 朋友较大

新宝6主管分享;商标注册能包过(保过)是骗人的

有一些商标代理机构对客户承诺注册商标可以包过,这只是代理机构的承诺,可以明确的告诉大家,国家商标局.商标评审委员会是不会承诺任何商标注册申请包过的. 我们今天从两个方面来分析一下这种现象,一是为什么不能100%保证注册成功:二是承诺包过的代理机构会给你埋下哪些坑. 一.为什么不能100%保证成功盲查期(空白期)盲查期是指,申请人把一份商标注册申请,提交到商标局之后,商标局需要3-4个月左右时间,对每份商标注册申请文件进行扫描.录入.划分图形要素.划分商标分卡.划分商品服务分类.财务对款.看你的申