交叉报表列头排序时遇到的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后的字符类型要一致的更多相关文章
- [WPF]ListView点击列头排序功能实现
[转] [WPF]ListView点击列头排序功能实现 这是一个非常常见的功能,要求也很简单,在Column Header上显示一个小三角表示表示现在是在哪个Header上的正序还是倒序就可以了. ...
- laravel-admin列表排序在使用了$grid->model()->latest()后$grid其它加上sortable()可排序的列在排序时不起作用
laravel-admin这个基于laravel的后台框架,简单易用,$grid的默认排序是主键升序的排列方式,但在使用了`$grid->model()->latest();`自定义默认排 ...
- MFC listcontrol 分列 添加行数据 点击列头排序
适用于 对话框程序 1.在工具箱中拖出 ListControl,然后右键-属性,view-Report 让你的ListControl变成这幅模样! 2.添加ListControl控件的control类 ...
- C++ 简单实现MFC ListControl 点击列头排序
说明: SetItemData可以为每一行绑定一个DWORD类型的变量.用GetItemData可以获得这个变量.举个例子,假设CListCtrl中你需要显示某个数据表中的记录,该表有个流水号主键ID ...
- MFC CListControl 点击列头排序的实现
SetItemData可以为每一行绑定一个DWORD类型的变量.用GetItemData可以获得这个变量.举个例子,假设CListCtrl中你需要显示某个数据表中的记录,该表有个流水号主键ID,一般这 ...
- DataWindow.NET 控件 实现点击列头排序
1.定义字段 Boolean ib_SetSort = true; string is_SortType = " ...
- 点击Listview列头排序
Private Sub ListView1_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader) ListView1.Sorted = ...
- datatables:如何禁用一列的排序
第一列是checkbox列,不需要排序,所以需要禁用掉. 代码如下: var table = $('#example1').DataTable( { 'paging' : true, 'lengthC ...
- delphi7 stringgrid 点列头排序
最近在做stringgrid的项目, 下面delphi7 正常使用,均摘抄网路,但做过细微调整才能正常使用 首先排序的过程 procedure Quicksort(Grid: TStringGrid; ...
随机推荐
- nodeJS文件路径总结
文件夹目录F:* test1* tes2* test3* test4* a.html*//例句fs.readFile('../../../a.html', function (err, html) { ...
- vs c++中读取数据流并存储
ifstream in("test.txt"); vector<string> vs; string s; while(!in.eof()) { in>>s ...
- mysql自增字段重排 或 归零
由于删除了某些记录行,所以自增字段不连续了.重排或归零的方法:方法1:truncate table 你的表名//这样不但重新定位自增的字段,而且会将表里的数据全部删除,慎用!方法2:delete fr ...
- python基础——使用list和tuple
python基础——使用list和tuple list Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时添加和删除其中的元素. 比如,列出班里所有同学的名字,就可以用 ...
- GCD的基本使用
// // ViewController.m // gcd队列与函数 // // Created by 诠释 on 15/9/3. // Copyright (c) 2015年 诠释. All rig ...
- spring的IOC和AOP
spring的IOC和AOP 1.解释spring的ioc? 几种注入依赖的方式?spring的优点? IOC你就认为他是一个生产和管理bean的容器就行了,原来需要在调用类中new的东西,现在都是 ...
- redis的PHP扩展包安装方法
试用Redis安装.php环境连接.测试 Redis介绍 Redis本质上一个Key/Value数据库,与Memcached类似的NoSQL型数据库,但是他的数据可以持久化的保存在磁盘上,解 ...
- UML从需求到实现----用例
关于用例图的概念相信不用我去说了 .能看到这篇文章的都是知道用例图概念的人. UML 中最重要的是什么图呢 ?毫无疑问应该是用例图 ,用例是后期时序图 和实际开发的重要依据. 说明一下用例图是怎么产生 ...
- loj 1034(最小点基)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25911 思路:强连通缩点,在新图中找入度为0的点的个数即可. #i ...
- SVN学习安装总结
前言: 第一次接触SVN的时候并不是自己学习SVN的时候,而是再看师哥师姐做项目的时候,看着他们打开SVN向上传东西的时候,我就在想,这是个什么东西,需要每个人都安装吗?大胆的我也就问了 ...