在做交叉報表列頭的排序時,遇到這三個問題,下面具體來說一下。
設計的資料庫的表結構如圖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