5

我一直在构建一个相当简单的更新语句,其中包括一个用于确定更新值的嵌套 case 语句。对于这两个字段,列描述是相同的 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
);

该代码有效,但是当我尝试使用 t.First_Col 代替字符串 'NoItem' 时,我得到字符集不匹配。

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 语句的类型由其中的第一个子句确定。在这种情况下,第一个子句是 varchar 字符串而不是 nvarchar。

试试这个:

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 回答