</pre><pre name="code" class="sql">
字符集不匹配問題:
<span style="font-family: SimSun; font-size: 14px; background-color: rgb(255, 255, 255);"></span><pre name="code" class="sql">select case 洗井原因
when '分注井測試前洗井'
then '1'
when '長關井開井前洗井'
then '2'
when '吸水能力下降洗井'
then '4'
else '99' end 洗井原因 from wash_v_pro2 t
代碼報錯
研究發現t.洗井原因是nvarchar2類型的,when的條件''中的漢字是varchar2類型的,所以要把''中的漢字都轉化爲nvarchar2類型
根據該文得知
應該用to_char函數來進行varchar2與 nvarchar2的類型轉換
case的用法中when與else後的字符類型必須一致,但是這樣還是不行,再把case後的字符類型改成與when、else後的字符類型一致纔算ok
select case to_char(洗井原因)
when to_char('分注井測試前洗井')
then '1'
when to_char('長關井開井前洗井')
then '2'
when to_char('吸水能力下降洗井')
then '4'
else '99' end 洗井原因 from wash_v_pro2 t
這樣就能取到了
然而後來我又注意到
case when 洗井原因 = '分注井測試前洗井'
then '1'
when 洗井原因 = '長關井開井前洗井'
then '2'
when 洗井原因 = '吸水能力下降洗井'
then '4'
else '99' end 洗井原因
這樣不用改類型也能取,不得其解,只能暫時知道待判斷列在case後時需要字符集匹配,集體使用to_char,而在when後單獨判斷時不需要字符集匹配。
缺失關鍵字:
select case 洗井狀態
when substr(洗井狀態,0,5) = '洗井未完成' then '2'
when '洗井正常完成' then '1'
else '' end 洗井狀態
from wash_v_pro2 t
語句when substr(洗井狀態,0,5) = '洗井未完成' then '2'
報錯:後來發現是因爲case後已經接了待判斷列,when後面不能再接判斷語句,
比如:
when substr(洗井狀態,0,5) = '洗井未完成'
改爲
when 1=1
同樣報錯。
改爲
when '字符串'
就不報錯了,證明when後面不能再加判斷語句了。
於是最終代碼改爲
</pre><p></p><pre name="code" class="sql"><pre name="code" class="sql">select case
<span style="white-space:pre"> </span>when substr(洗井狀態,0,5) = '洗井未完成'
<span style="white-space:pre"> </span> then '2'
<span style="white-space:pre"> </span>when 洗井狀態 = '洗井正常完成'
<span style="white-space:pre"> </span> then '1'
<span style="white-space:pre"> </span>else ''
<span style="white-space:pre"> </span>end 洗井狀態
from wash_v_pro2 t
case後面不再接待判斷列,所有判斷都寫在when後面,不再報錯了
總結:case when else end最好把判斷條件寫在when後面,不報錯,就是累點,複製粘貼比較多
case後面接帶判斷列,when後面接字符可以方便的直接進行匹配判斷,但是1.可能遇到字符不匹配2.不能在when後面再加條件進行判斷