交叉报表列头排序时遇到的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
设计的数据库的表结构如图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
相关文章推荐
- 交叉报表列头排序时遇到的oracle问题—oracle ORA-12704:字符集不匹配、varchar2转化为nvarchar2字符缺失、case when else后的字符类型要一致
- [转]Oracle中字符集的类型决定varchar2的字符长度
- 关于EXP-00056: 遇到 ORACLE 错误 1455 ORA-01455: 转换列溢出整数数据类型 EXP-00000: 导出终止失败 的问题解决方法整理
- oracle 截取字符(substr),检索字符位置(instr) case when then else end语句使用
- oracle中字符集的类型决定varchar2的字符长度
- oracle 截取字符(substr),检索字符位置(instr) case when then else end语句使用
- Oracle中字符集的类型决定varchar2的字符长度
- 字符集合决定varchar2的长度--Oracle定义varchar2()类型存储汉字的长度问题
- 关于oracle plsql数据库ORA-01480: STR 绑定值的结尾 Null 字符缺失 的问题解决办法。
- Oracle中由 case when 报错 ORA-12704:字符集不匹配的简易解决
- Oracle中 Union 中 ORA-12704:字符集不匹配问题的解决
- 程序运行过程中遇到“ORA-03114: not connected to ORACLE”的问题解决
- Weblogic&oracle 异常 ORA-01861: 文字与格式字符串不匹配
- Oracle ora-06861: 文字与格式字符串不匹配
- ORA-01861: 文字与格式字符串不匹配,在Oracle中insert 日期字段值:ORA-01861: 文字与格式字符串不匹配
- Oracle创建唯一索引遇到的问题(ORA-01452: 无法 CREATE UNIQUE INDEX; 找到重复的关键字)
- SQLQuery 查询Oracle char类型返回一个字符有关问题
- 使用GeoTools遇到的两个小问题:nvarchar类型字段无法识别,主键字段无法识别
- 验证码小练习强制将int类型转化为char类型遇到的小问题
- HTML报表日期格式不对 导致报错ORA-01861: 文字与格式字符串不匹配