2013-03-12 70 views
0

我有一個表格,其中包含有關聯繫人帳戶餘額的信息。它包含記錄他們有史以來第一張發票的日期以及最後一張發票的日期以及當前餘額的欄。更正SQL語法以檢查更新過程中是否存在空值

如創建的每個新的發票,其意圖是該表通過簡單的存儲過程沿着線進行更新:

CREATE PROCEDURE UpdateContactFinancialInformation 
    @ContactId int, 
    @InvoiceDate date, 
    @Amount money 
AS 
    UPDATE Contacts.ContactsFinancialInformation 
    SET LastInvoiceDate = @InvoiceDate, 
     CurrentBalance = CurrentBalance + @Amount 
    WHERE ContactId = @ContactId 

當一個新的接觸被創建用於它們在創建默認條目ContactsFinancialInformation表和FirstInvoiceDate列將具有默認值NULL

我想在上面的基本SQL語句中添加一個檢查,以便如果FirstInvoiceDate列爲NULL,那麼它也將被設置爲傳入存儲過程的參數@InvoiceDate

請問這樣做最有效的方法是什麼?

回答

0
UPDATE Contacts.ContactsFinancialInformation 

SET LastInvoiceDate = @InvoiceDate, 
    FirstInvoiceDate = CASE WHEN FirstInvoiceDate IS NULL THEN @InvoiceDate ELSE FirstInvoiceDate END, 

CurrentBalance = CurrentBalance + @Amount 

WHERE ContactId = @ContactId 

IMO,唯一的優勢儘管這個解決方案與COALESCE的代碼可讀性稍高一點。

1

你的意思是這樣

FirstInvoiceDate = COALESCE(FirstInvoiceDate,InvoiceDate)

COALESCE返回第一個值不爲空,所以它會用相同的值,它已經是更新,如果它不是空

編輯: 我不知道到底哪個SQL你有,它並不總是凝聚

DB2,SQL女士:合併

的MySQL:IFNULL

甲骨文:NVL

只需更換聚結在我與SQL的正確表達寫道行你使用

+0

謝謝我在這方面甚至沒有考慮過凝聚。 – 2013-03-12 15:41:18