• 交叉报表列头排序时遇到的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
  • 相关阅读:
    正则表达式
    什么是面向对象
    关于jdk,jre,jvm和eclipse的一些总结
    分析ajax爬取今日头条街拍美图
    pycharm误删恢复方法及python扩展包下载地址
    django 之 视图层、模板层
    django
    django框架基础二
    jdango框架基础一
    安装软件,提高速度,可以使用清华源
  • 原文地址:https://www.cnblogs.com/telwanggs/p/5588269.html
Copyright © 2020-2023  润新知