您好,登錄后才能下訂單哦!
NULL表示unknown,不確定值,所以任何值(包括null值)和NULL值比較都是不可知的,在on子句,where子句,Merge或case的when子句中,任何值和null比較的結(jié)果都是false,這就是NULL設(shè)下的陷阱,我被坑過(guò)。
有一次,我使用Merge同步數(shù)據(jù),由于target表中存在null值,雖然在source表中對(duì)null值做過(guò)處理,但是忽略了target表中的null值,導(dǎo)致數(shù)據(jù)merge失敗。
step1,創(chuàng)建示例數(shù)據(jù)
--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,插入示例數(shù)據(jù)
示例數(shù)據(jù)中,Source表和Target表中都存在null值,不管是在Source表,還是在Target表,都要避免和null值進(jìn)行比較。
--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,錯(cuò)誤寫(xiě)法:只處理Source表中的null,而忽略Target表中的null
-- -1 stand for unknwon valuemerge dbo.dt_target t using 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表中的數(shù)據(jù),數(shù)據(jù)不同步,不同步的原因是when matched子句之后的and 條件, t.code中存在null值,null值和任何值(包括null值)比較的結(jié)果都是unknown,在when子句中視為false。
正確寫(xiě)法1,不管是在target表,還是在source表,只要存在null值,必須進(jìn)行處理,避免出現(xiàn)和null進(jìn)行比較的情況。
處理的方式是使用一個(gè)值來(lái)表示unknwon,如果ID列有效值不可能是負(fù)值,那么可以使用-1來(lái)代替unknown。因?yàn)?1和-1 是相等的,邏輯上就將null值和null值視為相同。
-- -1 stand for unknwon valuemerge dbo.dt_target t using 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);
正確寫(xiě)法2,在條件子句中,使用is null或 is not null來(lái)處理null值。
Tsql 使用is null和is not null來(lái)確實(shí)是,不是 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.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);
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。