您的位置:首页 > 数据库 > Oracle

交叉报表列头排序时遇到的oracle问题—oracle ORA-12704:字符集不匹配、varchar2转化为nvarchar2字符缺失、case when else后的字符类型要一致

2012-12-28 11:23 323 查看
在做交叉报表列头的排序时,遇到这三个问题,下***体来说一下。

设计的数据库的表结构如图1所示:



图1
要处出来student_name_,s.grade_,s.subject_name_,这三个属性,当时我是这样写的sql语句:

select s.student_name_, s.grade_, s.subject_name_,
case s.subject_name_
when '语文' then 'A语文'
when '数学' then 'B数学'
when '英语' then 'C英语'
else s.subject_name_
end
from student s

执行之后报如图2的错误:



图2
后来发现出错的原因在于:subject_name_是nvarchar2类型的所以,‘’中的汉字是varchar2类型的,所以要把‘’中的汉字都转化为nvarchar2类型,于是将sql语句改成如下所示:

select s.student_name_, s.grade_, s.subject_name_,
case s.subject_name_
when cast('语文'as
nvarchar2(10)) then
cast('A语文'asnvarchar2(10))
when cast('数学'as
nvarchar2(10))
then cast('B数学'asnvarchar2(10))
when cast('英语'as
nvarchar2(10))
then cast('C英语'asnvarchar2(10))
else s.subject_name_
end
from student s

但是,运行之后效果不是我想的那样!结果如图3所示:



图3
很奇怪,“语文”和“数学”都很正常,英语就不正常!再执行语句

select cast('英语' as
nvarchar2(10))
from student s
where s.subject_name_ ='英语'

结果是这样的,如图4所示:



图4
也就是 varchar2在向nvarchar2转化的时候造成了字符丢失,在找解决办法的时候在看到这篇文章http://blog.csdn.net/tobeistdo/article/details/5610287,才知道应该用to_char函数来进行varchar2与
nvarchar2的类型转换。于是,就又改成这样写了:

select s.student_name_,s.grade_,s.subject_name_,
case s.subject_name_
when to_char('语文')
then to_char('A语文')
when to_char('数学')
then to_char('B数学')
when to_char('英语')
then to_char('C英语')
else s.subject_name_
end as other_name_
from student s

结果,还是报错,如图5所示,还是字符集不匹配:



图5
查了很多牛人写的资料才知道:case的用法中when与else后的字符类型必须一致,但是这样还是不行,再把case后的字符类型改成与when、else后的字符类型一致才算ok,即:

select s.student_name_,s.grade_,s.subject_name_,
case to_char(s.subject_name_)
when to_char('语文')
then to_char('A语文')
when to_char('数学')
then to_char('B数学')
when to_char('英语') then
to_char('C英语')
else to_char(s.subject_name_)
end as other_name_
from student s

最终如图6所示:



图6
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐