交叉报表列头排序时遇到的oracle问题—oracle ORA-12704:字符集不匹配varchar2转化为nvarchar2字符缺失case when else后的字符类型要一致
Posted 疯子加天才
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了交叉报表列头排序时遇到的oracle问题—oracle ORA-12704:字符集不匹配varchar2转化为nvarchar2字符缺失case when else后的字符类型要一致相关的知识,希望对你有一定的参考价值。
在做交叉报表列头的排序时,遇到这三个问题,下面具体来说一下。
设计的数据库的表结构如图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
- 顶
- 0
以上是关于交叉报表列头排序时遇到的oracle问题—oracle ORA-12704:字符集不匹配varchar2转化为nvarchar2字符缺失case when else后的字符类型要一致的主要内容,如果未能解决你的问题,请参考以下文章