case when缺失关键字和字符集不匹配

本文探讨了在Oracle数据库中遇到的字符集不匹配问题,特别是涉及nvarchar2和varchar2类型转换时的挑战。文章指出,使用TO_CHAR函数可以解决类型不匹配的问题,但在CASE WHEN语句中,当在WHEN和ELSE后需要保持字符类型一致。此外,还揭示了一个常见的错误——在CASE后直接接判断列,导致无法在WHEN后面添加额外的判断语句。解决方案是将判断条件放在WHEN子句中,尽管这可能导致代码冗长。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

</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类型

根据该文得知

oracle中nvarchar2字符集不匹配

应该用to_char函数来进行varchar2 nvarchar2的类型转换

case的用法中whenelse后的字符类型必须一致,但是这样还是不行,再把case后的字符类型改成与whenelse后的字符类型一致才算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后面再加条件进行判断

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值