1. 程式人生 > >交叉報表列頭排序時遇到的oracle問題—oracle ORA-12704:字符集不匹配、varchar2轉化為nvarchar2字元缺失、case when else後的字元型別要一致

交叉報表列頭排序時遇到的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的用法中whenelse後的字元型別必須一致,但是這樣還是不行,再把case後的字元型別改成與whenelse後的字元型別一致才算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