交叉報表列頭排序時遇到的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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM