5

私は、更新値を決定するためのネストされたcaseステートメントを含む非常に単純なupdateステートメントを作成してきました。列の説明は、両方のフィールドで同じnvarchar(32)です。

以下のコード

UPDATE TableA t
SET t.Last_Col =
( CASE WHEN t.First_Col = 'ItemOne'
       THEN 'anItemOne'
       WHEN t.First_Col = 'ItemTwo'
       THEN CASE WHEN t.Second_Col = 'ItemTwo_A'
                 THEN 'aSecondItem_A'
                 ELSE 'aSecondItem'
                 END
ELSE 'NoItem'
END
);

そのコードは機能しますが、文字列'NoItem'の代わりにt.First_Colを使用しようとすると、文字セットの不一致が発生します。

ELSE t.First_Col
END
);

動作しません。t.First_Colとt.Last_Colはどちらもnvarchar2(32)であり、とにかく必要ではないと思うキャストを使用しようとしています。

ELSE CAST(t.First_Col AS NVARCHAR2(32)) 
END );

ヒントやアドバイスは大歓迎です。いつものように事前に感謝します。

4

2 に答える 2

6

case ステートメントのタイプは、最初の句によって決まります。この場合、最初の句は nvarchar ではなく varchar 文字列です。

これを試して:

UPDATE TableA t
    SET t.Last_Col = (CASE WHEN t.First_Col = N'ItemOne'
                           THEN N'anItemOne'
                           WHEN t.First_Col = N'ItemTwo'
                           THEN (CASE WHEN t.Second_Col = N'ItemTwo_A'
                                      THEN N'aSecondItem_A'
                                      ELSE N'aSecondItem'
                                 END)
                           ELSE N'NoItem'
                        END ); 
于 2012-05-09T17:56:31.890 に答える
1

CASE ステートメントが返すオプション間に文字セットの不一致があるようです。

働く

'anItemOne'     varchar
'aSecondItem_A' varchar
'aSecondItem'   varchar
'NoItem'        varchar

動作しない

'anItemOne'     varchar
'aSecondItem_A' varchar
'aSecondItem'   varchar
t.First_Col     nvarchar

修理

戻り値のオプションをnvarchars (つまりN'anItemOne') にしてみてくださいt.First_Col

N'anItemOne'     nvarchar
N'aSecondItem_A' nvarchar
N'aSecondItem'   nvarchar
t.First_Col      nvarchar
于 2012-05-09T17:56:15.750 に答える