2013-01-01 73 views
1

我有一種情況,用戶可能會或可能不會提供需要進入包含該用戶信息的行的各種數據位。問題是,他們需要隨着時間的推移向該行中添加多個條目,並且我不想將任何先前存在的值(如果這些值已經過去設置)清空。是否可以有條件地設置MySQL更新語句中的某些值?

我的願望是做一些看起來(在僞代碼)是這樣的:

變種A,B,C; //這是用戶提供的任何一個都可以是空在任何時間值

update user if a != null set name = a, if b != null set phone = b, if c != null set email c 

我一直在努力塑造一個如果以這種方式工作,但我得到我已經試過各種方法的語法錯誤。希望有人能夠以正確的方式闡明這一點(如果可能的話)。

TIA

回答

2

的一種方式做,這是對每列「默認」其與COALESCE()原始值。

UPDATE user 
SET name = COALESCE(a, name), 
    phone = COALESCE(b, phone), 
    email = COALESCE(c, email) 
WHERE ... 

COALESCE()返回第一個非空的說法,所以如果a爲null,這將只是返回的name原始值,所以也就沒有淨變化。我們還支持一個像COALESCE()那樣工作的函數ISNULL(),但COALESCE()是標準的SQL。另外,COALESCE()支持兩個以上的參數。

+0

真棒,這看起來完全像我需要的,謝謝。 –

1

這裏是如何做到這一點純粹SQL:

UPDATE user 
SET name = IF(a IS NULL, name, a), 
    phone = IF(b IS NULL, phone, b), 
    email = IF(c IS NULL, email, c) 
+0

我認爲我更喜歡coalesce方法,但是對於另一個可行的替代方案,無論如何+1。 –

+0

我也喜歡他們。 :) – Barmar

2

您可以使用COALESCE,如:

UPDATE user SET name = coalesce(a, name), ... 

也許更好的方法是動態創建您的UPDATE語句,只包括了需要更新的字段。

相關問題