SQL Updateの場合のif/else文の必要性

ケースが異なる1つのUpdateステートメントを使用してデータベース内の複数のレコードを更新するにはどうすればよいですか。

refundNumber = CASE _
WHEN salesRecords.invNo='1' AND itemNo='250' AND length(refundNumber) > 1 THEN _
concat(refundNumber, ', 88' ) Else '88' _
WHEN salesRecords.invNo='1' AND itemNo='7095' AND length(refundNumber) > 1 THEN _
concat(refundNumber, ', 88' ) Else '88'  _
END

これは失敗し、次のようになります。

refundNumber = CASE _
WHEN invNo='1' AND itemNo='250' AND length(refundNumber) > 1 THEN _
concat(refundNumber, ', 88' )  _
WHEN invNo='1' AND itemNo='7095' AND length(refundNumber) > 1 THEN _
concat(refundNumber, ', 88' ) Else '88'  _
END

違いは、Elseが最後に来るということです。

しかし、すべてのレコードの refundNumber を88に設定します。

What I am trying to do is add a value to a field named refundNumber to those items where the invNo = 'currentInvoiceNumber' AND itemNo = 'itemNumber'

BUT, since refundNumber is a text field which is meant to contain a comma separated list, I am trying to determine whether this field is empty or not, if it is, just enter the number, if it isn't, append the number preceded by a comma to the existing field content. Hence the length(refundNumber) > 1 THEN concat(refundNumber, ', 88' ) bit.

私はそれをテストしていないが、私はVB論理私が必要と思います:

IF invNo='1' And itemNo='250' THEN
    IF length(refundNumber) > 1 THEN 
        concat(refundNumber, ', 88' )  
    ELSE
        '88'
    END IF
ELSE IF invNo='1' And itemNo='7095' THEN        
    IF length(refundNumber) > 1 THEN 
        concat(refundNumber, ', 88' )  
    ELSE
        '88'
    END IF
Else
    refundNumber '- leave the field value as is because it does not comply with any of the above conditions
END IF

これを SQL CASE 文字列に変換するにはどうすればよいですか?

0
ああ、私はそれを考えていないので、私は推測する!彼らはいつも私の頭を混乱させるCASEステートメントでは良くない!
追加された 著者 Jamie Hartnoll,
入れ子にされたケースを使用していない理由はありますか?
追加された 著者 Daniel Hilgarth,
あなたのVBの同等物もネストされているので、私は尋ねているだけです...
追加された 著者 Daniel Hilgarth,

3 答え

InvNoが '1'でなくitemNoが '250'または '7095'でないレコードを更新したくない場合は、Where句を使用してセットをこの基準に限定するのはなぜですか?それから、ケース式を使って払い戻し番号と88を連結する必要がありますが、これを使う必要はありません。

UPDATE yourtable
SET refundNumber = ISNULL(CONCAT(NULLIF(refundNumber, ''), ', 88'), '88')
WHERE InvNo = '1'
AND itemNo in ('250', '7095')

または、ネストされたcase式を使用しますか?

2
追加された
ああ!それがあなたのやり方です!私は実際にwhere節を複数行の更新に適切に配置する方法を実際には考え出していません!私は明日これを正しく試してみるでしょうが、それは私が必要とするものを正確に見て、ネスティングよりも混乱を少なくします。ありがとう。
追加された 著者 Jamie Hartnoll,
なんらかの理由でそれはうまくいかず、CASEに WHERE in が追加されていました! :-)
追加された 著者 Jamie Hartnoll,

これを試して:

refundNumber = CASE _
WHEN invNo='1' AND itemNo='250' THEN _
    CASE WHEN length(refundNumber) > 1 THEN concat(refundNumber, ', 88' )  _
    ELSE '88' END
WHEN invNo='1' AND itemNo='7095' THEN _
    CASE WHEN length(refundNumber) > 1 THEN concat(refundNumber, ', 88' ) _
    Else '88' END
END
0
追加された

あなたが大文字小文字でそれをする必要がある場合は、これを試してください、しかしWHERE句を使用してGarethDの答えはおそらく良いです

refundNumber = CASE WHEN (invNo='1' AND itemNo='250')
                Or (invNo='1' AND itemNo='7095')
                THEN
                   CASE WHEN length(refundNumber) > 1 
                   THEN concat(refundNumber, ', 88' )
                   ELSE '88'
                   END
                ELSE refundnumber
           END  
0
追加された