博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NULL的陷阱:Merge
阅读量:5856 次
发布时间:2019-06-19

本文共 1934 字,大约阅读时间需要 6 分钟。

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

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

step1,创建示例数据

--create source tablecreate table dbo.dt_source(id int null,code int null)on [primary]with(data_compression=page)--create target tablecreate 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 tableinsert 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 valuemerge dbo.dt_target tusing dbo.dt_source s    on t.id=s.idwhen matched and( t.code<>isnull(s.code,-1))    then update        set t.code=s.codewhen 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 valuemerge dbo.dt_target tusing dbo.dt_source s    on t.id=s.idwhen matched and( isnull(t.code,-1)<>isnull(s.code,-1))    then update        set t.code=s.codewhen 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 tusing dbo.dt_source s    on t.id=s.idwhen matched and( t.code<>s.code or t.code is null or s.code is null)    then update        set t.code=s.codewhen not matched    then insert(id,code)    values(s.id,s.code);

 

转载于:https://www.cnblogs.com/wangsicongde/p/7551284.html

你可能感兴趣的文章
Wordpress3.2去除url中的category(不用插件实现)
查看>>
The 'Microsoft.Jet.OLEDB.4.0' provider is not registered on the local machine-Excel2003
查看>>
《Java 2 图形设计卷Ⅱ- SWING》第12章 轻量容器
查看>>
macOS Sierra 代码显示未来 Mac 将搭载 ARM 芯片
查看>>
《Arduino家居安全系统构建实战》——1.3 部署安全系统的先决条件
查看>>
Linux 中如何通过命令行访问 Dropbox
查看>>
《jQuery移动开发》—— 1.3 小结
查看>>
使用 Flutter 反序列化 JSON 的一些选项
查看>>
开发进度——4
查看>>
代码优化
查看>>
使用原理视角看 Git
查看>>
Node.js 的module 系统
查看>>
经典c程序100 例
查看>>
Fast enumerate
查看>>
页面中富文本的使用
查看>>
etymology-F
查看>>
FastD 最佳实践一: 构建 API
查看>>
Mycat安装以及使用测试
查看>>
react、react-router、redux 也许是最佳小实践1
查看>>
JS里验证信息
查看>>