交叉報表列頭排序時遇到的oracle問題—oracle ORA-12704:字元集不匹配、varchar2轉化為nvarchar2字元缺失、case when else後的字元類型要一致____oracle

來源:互聯網
上載者:User

在做交叉報表列頭的排序時,遇到這三個問題,下面具體來說一下。

設計的資料庫的表結構如圖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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.