2010-06-04 58 views
3

我想用兩個日期更新一條記錄,如果我沒有更新的新值,就會使現有數據完好無損。如何更新SQL中的選擇性字段(保留一些不變)?

下面是一個示例表記錄:

id last_foo last_bar 
-- ---------- ---------- 
1 2010-05-30 2010-05-30 

,我使用查詢:

UPDATE sampledates 
    SET last_foo = @LastFoo, 
     last_bar = @LastBar 
WHERE id = @ID; 

如果我爲空的日期時間LastFooLastBar是空的,我想保持現有的SQL值不變,否則更新。

例如,假設我更新這個記錄使用下面的值(這是C#,但任何語言適用):

DateTime? LastFoo = new DateTime('2010-06-04'); 
DateTime? LastBar = null; 

我想記錄則是:

id last_foo last_bar 
-- ---------- ---------- 
1 2010-06-04 2010-05-30 

我知道我可以改變我的查詢文本,以省略第二列,如果值爲空,但我想知道是否有一種方法,我可以保持原樣查詢並指定我不更改指定的列。

+0

我檢查HTTP:// stackoverflow.com/questions/1637901/best-practise-when-updating-individual-fields-in-a-database-record但它並不完全相同。 – JYelton 2010-06-04 21:45:13

+0

你使用哪個數據庫和版本? – 2010-06-04 21:48:37

+0

@Mark:DATETIME表示MySQL或SQL Server,但提供的所有答案都是不可知的 – 2010-06-04 21:50:31

回答

8

嘗試

UPDATE sampledates 
SET last_foo = COALESCE(@LastFoo,last_foo), 
last_bar = COALESCE(@LastBar,last_bar) 
WHERE id = @ID; 
+0

完美工作。謝謝你給我指出'COALESCE'。 – JYelton 2010-06-04 21:54:06

6

您可以使用COALESCE

UPDATE sampledates 
SET last_foo = COALESCE(@LastFoo, last_foo), 
    last_bar = COALESCE(@LastBar, last_bar) 
WHERE id = @ID; 

在SQL Server你使用ISNULL代替COALESCE小的性能提升。

UPDATE sampledates 
SET last_foo = ISNULL(@LastFoo, last_foo), 
    last_bar = ISNULL(@LastBar, last_bar) 
WHERE id = @ID; 
+0

感謝Mark爲'ISNULL'參考。 SQLMenace早些時候有同樣的想法,所以我選擇了他的答案。 – JYelton 2010-06-04 22:10:21

2

試試這個(這是未經測試,我沒有可用SSMS我現在)

UPDATE sampledates 
    SET last_foo = CASE WHEN @LastFoo IS NULL THEN last_foo ELSE @LastFoo END, 
     last_bar = CASE WHEN @LastBar IS NULL THEN last_foo ELSE @LastBar END 
    WHERE id = @ID; 
+0

出於好奇,什麼更快? COALESCE,ISNULL還是CASE邏輯? – kprobst 2010-06-04 21:50:10

+2

ISNULL最後我聽說過。然而,合併是ANSI標準,並且適用於1個以上的案例。 ISNULL只接受一個可以爲null的參數,coalesce需要儘可能多地拋出它。 – 2010-06-04 21:52:52

1

你可以嘗試像

UPDATE sampledates 
SET last_foo = (case when @LastFoo IS NULL then last_foo else @LastFoo end), 
last_bar = (case when @LastBar IS NULL then last_bar else @LastBar end) 
WHERE id = @ID; 
相關問題