0

我有一个表格,其中包含有关联系人帐户余额的信息。它包含用于跟踪他们曾经拥有的第一张发票的日期、他们拥有的最后一张发票的日期以及当前余额的列。

在创建每张新发票时,打算通过一个简单的存储过程更新此表,如下所示:

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正在传递到存储过程的参数。

请问最有效的方法是什么?

4

2 回答 2

1

你的意思是

FirstInvoiceDate = COALESCE(FirstInvoiceDate, InvoiceDate)

coalesce 返回第一个不为空的值,因此如果它不为空,它将使用它已经存在的相同值进行更新

编辑:我不完全知道你有哪个 SQL,它并不总是合并

DB2,SQL 女士:COALESCE

MySQL:IFNULL

甲骨文:nvl

只需将我写的行中的 COALESCE 替换为您正在使用的 sql 的正确表达式

于 2013-03-12T15:33:18.243 回答
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 相比的唯一优势是代码可读性更高。

于 2013-03-12T15:38:28.143 回答