[SQL]若有資料則更新 無則新增的SQL寫法

  • 1462
  • 0
  • SQL
  • 2017-03-28

利用merge的方法來達成需求

最近遇到一個需求需要匯入資料  對已經存在的資料進行更新 

之前想過要用直接透過程式寫if來做 先select count來看看 再去決定要更新還是新增

想一想要寫一堆function 還要一直跟DB連線覺得累累der 乾脆一次請求做完

四處求助跟餵狗之後決定使用Merge的方法來實作

SQL如下

merge into [TargetTable] a 
using (select @id id, @parameter1 parameterName) b   --[SourceTable]
on a.id = b.id --關聯
when matched then
	UPDATE SET parameter1 = @paramete1, parameter2 = @parameter2, parameter3 = @parameter3
when not matched then
	INSERT VALUES(@paramete1, @paramete2, @paramete3, @paramete4);

當初一直卡在using這邊 我哪裡來的source table去做merge   原來自己犯蠢  可以自己做一個假table出來merge 

在when matched then 是可以再加上條件的 像這樣

when matched and b.prameter1 ='1234' the

這樣必須source table的pramerter1 等於'1234'才會進入下方的敘述句

後來遇到一個奇耙的需求  還要另外判斷一些條件才決定要如何更新  

這個需求的情境是 再status = '0'的時候更新某兩個欄位  等於'1'的時候更新某一個欄位

當初我打算這樣寫

merge into [TargetTable] a 
using (select @id id, @parameter1 parameter, @status status) b   --[SourceTable]
on a.id = b.id --關聯
when matched and b.status = '0' then
    UPDATE SET parameter1 = @paramete1, parameter2 = @parameter2
when matched and b.status = '1' then
    UPDATE SET parameter3 = @parameter3
when not matched then
	INSERT VALUES(@paramete1, @paramete2, @paramete3, @paramete4);

很抱歉 這樣是會報錯誤出來的 沒有辦法寫兩個when matched敘述句的

後來一樣去餵狗想辦法  找到使用case的方法來實作

merge into [TargetTable] a 
using (select @id id, @parameter1 parameter, @status status) b   --[SourceTable]
on a.id = b.id --關聯
when matched and b.status = '0' then
	parameter1 = case when @status = '0' then @parameter1 else a.parameter1 end,
	parameter2 = case when @status = '0' then @parameter2 else a.parameter2 end,
	parameter3 = case when @status = '1' then @parameter3 else a.parameter3 end
when not matched then
	INSERT VALUES(@paramete1, @paramete2, @paramete3, @paramete4);

只要條件不符合 就讓它等於自己就好拉~

符合在更新就好 這樣就達成所要的需求拉!