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)

合体はnullではない最初の値を返すため、nullでない場合は、以前と同じ値で更新されます。

編集:私はあなたが持っているSQLを正確に知りません、それは常に合体するとは限りません

DB2、Ms SQL:COALESCE

MySQL:IFNULL

Oracle: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 に答える