2017-05-31 21 views
0

したがって、データが再提出されたときにammount値に従って列ステータスを更新することを目的とした請求書という表があります。複数のIF文を使用した重複キー更新

は、例えば、私はこの結果のセットがあります。statemetsはこれを達成するためのIF

<table> 
    <thead> 
     <tr> 
     <th>Sap Code</th> 
     <th>Document No.</th> 
     <th>Description</th> 
     <th>Net Change</th> 
     <th>Status</th> 
     </tr>   
</thead> 
<tbody> 
<tr> 
    <td>8000000</td> 
    <td>123456</td> 
    <td>March invoice A</td> 
    <td>Not Paid</td> 
</tr> 
</tbody> 

使用複数を、私はただ一つの条件と試みたが、動作しません。私がparamsにバインドしているので、これがSQLの問題かPDOの問題かどうかはわかりません。

ammountが同じ場合はステータスを「Payed」に、新しいammountが現在の値よりも小さい場合は「パーティーペイ」にステータスを更新したいと思います。レコードが新規の場合はステータス「未払い」。

これは私の現在のクエリです:

INSERT INTO invoice (sap_code, document_number, description, net_change, status) 
VALUES (:sap_code,:document_number,:description,:net_change, 'Not payed') 
ON DUPLICATE KEY UPDATE 
    sap_code= :sap_code, document_number= :document_number, description= :description, 
    status = if(VALUES(net_change) = :net_change, VALUES(status), 'Paid') 

私が間違ってやって上の任意の提案?

ありがとうございます。 (動作しない)

NEW TEST

ON DUPLICATE KEY UPDATE 
    sap_code= :sap_code, document_number= :document_number, description= :description, 
    status = CASE WHEN :net_change = net_change 
      THEN 'Paid' 
      ELSE 'Partially Paid' END, 
    net_change = :net_change 
+1

'VALUES(net_change)'は ':net_change'と同じですので、' IF'は常にtrueになります。 – Barmar

+0

はい、マニュアルから: "つまり、ON DUPLICATE KEY UPDATE句のVALUES(col_name)は、挿入されるcol_nameの値を参照し、重複キーの競合が発生していないことを示します。 – miken32

答えて

0

あなたがテーブルの列とVALUES(net_change)を比較する必要がありますが、パラメータが割り当てられていません。

ON DUPLICATE KEY UPDATE 
    sap_code= :sap_code, document_number= :document_number, description= :description, 
    status = IF(:net_change = net_change, 'Paid', VALUES(status)), 
    net_change = :net_change 
+0

これは機能しません。さらに、私は拘束力がありません:ステータス – Nelson

+0

あなたは何をしようとしているのか少し混乱しています。なぜ新しい請求書を追加し、既存の請求書の一部または全部を払うのに同じコードを使用するのですか? – Barmar

+0

私のアプリケーションでは、ユーザーがmicrosoft excelドキュメントを介して情報を提出するためです。 – Nelson

関連する問題