2013-10-04 37 views
1

有什麼辦法可選更新任何多個字段的SQL語句?我只能得到類似的東西:任何更新多個字段的SQL語句中的

UPDATE Customer SET 
    ContactName = ? <=== what to do here if ? is null??? 
, CompanyName = ? <=== what to do here if ? is null??? 
, AddressId = ? <=== what to do here if ? is null??? 
, ... 
WHERE CustomerId = ? 

由於包裝層和MySQL的限制,它必須是單個語句。

爲了澄清,我想創建將與一個或多個非空值列出的字段上運行,並且將只更新那些字段,其中值不爲空,只留下其他的一個聲明。

這是一個RESTful更新API,我不希望每個可能的字段組合都有一個單獨的語句,我不想​​要求API調用者提供記錄中的每個字段,這將是不實用的並且不會面向未來(添加一個字段打破現有的API調用)。而且因爲它是一個REST API,我正在尋找映射POST /customer/xxx?ContactName=...&CompanyName=...來更新記錄。

+0

如果'ContactName'是'NULL',有什麼大不了的?或者你的意思是「我如何只更新已賦值的字段?」你用什麼應用程序編程語言來執行這些查詢? – tadman

回答

1

並不完全清楚你的目標,但我認爲你正在尋找的coalesce功能;它將返回第一個非空值:

mysql> SELECT COALESCE(NULL,1); - > 1

的MySQL> SELECT COALESCE(NULL,NULL,NULL); - > NULL

所以,你可以設置一個「默認」的情況下,使用值爲null:

UPDATE Customer SET 
    ContactName = COALESCE(?, <Some default>) 
... 

如果你不想改變字段,只要使用的電流值:

UPDATE Customer SET 
    ContactName = COALESCE(?, ContactName) 
+0

不,我不想默認,本身,我想離開沒有提供任何值的字段,因爲他們目前是...除非有辦法讓'<一些默認值>'等於當前的字段值? –

+0

@ManicCoder然後你可以設置默認值爲當前值 – Igor

0

一般你會希望使用現有的值,如果該參數是在更新空:

UPDATE Customer SET 
    ContactName = COALESCE(?,ContactName) 
0
UPDATE Customer SET 
    ContactName = ifnull(?,ContactName) 
, CompanyName = ifnull(?,CompanyName) 
, AddressId = ifnull(?,AddressId) 
WHERE CustomerId = ? 

SQL Fiddle