现在的位置: 首页 > 综合 > 正文

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

2013年04月22日 ⁄ 综合 ⁄ 共 1579字 ⁄ 字号 评论关闭

在做交叉报表列头的排序时,遇到这三个问题,下面具体来说一下。

设计的数据库的表结构如图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的用法中whenelse后的字符类型必须一致,但是这样还是不行,再把case后的字符类型改成与whenelse后的字符类型一致才算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

抱歉!评论已关闭.