2013-03-12 65 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