为什么我的嵌套case语句返回字符集不匹配?

时间:2012-05-09 17:50:05

标签: sql oracle sql-update

我一直在构建一个相当简单的更新语句,其中包含一个嵌套的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 );

非常感谢任何提示或建议。 一如既往地感谢。

2 个答案:

答案 0 :(得分:5)

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 ); 

答案 1 :(得分:1)

看起来字符集不匹配是CASE语句返回的选项之间的。

工作

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

不工作

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

修复

尝试制作返回选项nvarchar s(即N'anItemOne')然后t.First_Col就可以了。

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