• 交叉报表列头排序时遇到的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
  • 相关阅读:
    CSS强制换行
    Android 软件开发的盈利模式
    比较Collection 和Collections的区别
    Jsp 中taglib标签的妙用
    常用搜索引擎大全
    Jsp 中登陆界面的实现方法
    Jsp 中JavaScript 和 Java代码的异步执行特点
    Jsp struts 标准配置测试版
    div demo
    多线程模拟银行业务调度系统
  • 原文地址:https://www.cnblogs.com/telwanggs/p/5588269.html
Copyright © 2020-2023  润新知