交叉報表列頭排序時遇到的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
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轉化的時候造成了字元丟失,在找解決辦法的時候在看到這篇文章
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