当前位置: 首页 > article >正文

oracle使用case when报错ORA-12704字符集不匹配原因分析及解决方法

问题概述

使用oracle的case when函数时,报错提示ORA-12704字符集不匹配,如下图,接下来分析报错原因并提出解决方法。

样例演示

现在有一个TESTTABLE表,本表包含的字段如下图所示,COL01字段是NVARCHAR2类型,COL02字段是VARCHAR2类型。

场景一

使用case简单函数,case后面的内容和when后面的内容,不能同时包含NVARCHAR2类型和其他类型数据(比如VARCHAR2或者单引号包围的常量),否则会报错ORA-12704字符集不匹配。

--执行报错:case后面的col01是NVARCHAR2类型,when后面是单引号包围的常量。

select case col01 when '是' then 'Y' else 'N' end as ret from TESTTABLE;

--执行报错:case后面的col01是NVARCHAR2类型,when后面的col02是VARCHAR2类型。
select case col01 when col02 then 'Y' else 'N' end as ret from TESTTABLE;

--执行成功:case后面的col01和when后面的col01都是NVARCHAR2类型。
select case col01 when col01 then 'Y' else 'N' end as ret from TESTTABLE;

--执行成功:case后面的col02和when后面的col02都是VARCHAR2类型。
select case col02 when col02 then 'Y' else 'N' end as ret from TESTTABLE;

场景二

使用case搜索函数,when后面条件中的内容可以同时包含NVARCHAR2类型和其他类型数据(比如VARCHAR2或者单引号包围的常量),可以正常执行,不会报错ORA-12704字符集不匹配。

--成功:when后面,等号左边的col01是NVARCHAR2类型,等号右边是单引号包围的常量。

select case when col01='是' then 'Y' else 'N' end as ret from TESTTABLE;

--成功:when后面,等号左边的col01是NVARCHAR2类型,等号右边的col02是VARCHAR2类型。
select case when col01=col02 then 'Y' else 'N' end as ret from TESTTABLE;

--成功:when后面,等号左边的col02是VARCHAR2类型,等号右边是单引号包围的常量。
select case when col02='是' then col01 else col01 end as ret from TESTTABLE;

场景三

在case when函数中,then或else后面的内容,不能同时包含NVARCHAR2类型和其他类型数据(比如VARCHAR2或者单引号包围的常量),否则会报错ORA-12704字符集不匹配。

--报错:then后面的col01字段是NVARCHAR2类型,else后面是单引号包围的常量。

select case when col01='是' then col01 else 'N' end as ret from TESTTABLE;

--报错:then后面的col01是NVARCHAR2类型,else后面的col02是VARCHAR2类型。
select case when col01='是' then col01 else col02 end as ret from TESTTABLE;

--报错:第一个then后面以及else后面的col01是NVARCHAR2类型,第二个then后面的col02是VARCHAR2类型。
select case when col01='是' then col01 when col01='否' then col02 else col01 end as ret from TESTTABLE;

--成功:所有then或else后面的内容都不是NVARCHAR2类型数据。
select case when col01='是' then 'Y' when col01='否' then col02 else 'N' end as ret from TESTTABLE;

--成功:所有then或else后面的内容都是NVARCHAR2类型数据。
select case when col01='是' then col01 when col01='否' then col01 else col01 end as ret from TESTTABLE;

解决方法

--方法1:用to_char函数对NVARCHAR2类型数据进行转换。
select case to_char(col01) when '是' then 'Y' when col02 then 'N' else col02 end as ret from TESTTABLE;


--方法2:用cast函数将其他类型转换为NVARCHAR2类型。
select case col01 when cast('是' as nvarchar2(10)) then 'Y' when cast(col02 as nvarchar2(10)) then 'N' else col02 end as ret from TESTTABLE;


http://www.kler.cn/a/510339.html

相关文章:

  • 游戏引擎学习第81天
  • Linux(DISK:raid5、LVM逻辑卷)
  • postgres数据库中_varchar的数组存储方法如何查找
  • 数据结构题目 课时6
  • AV1视频编解码简介、码流结构(OBU)
  • 物联网网关Web服务器--Boa服务器移植与测试
  • 三电平空间矢量详解
  • Vue3 整合 ArcGIS 技术指南
  • 计算机网络 (49)网络安全问题概述
  • ELF2开发板(飞凌嵌入式)基本使用的搭建
  • 统信V20 1070e X86系统编译安装mysql-5.7.44版本以及主从构建
  • QT中多线程的使用(一)
  • 三、SysTick系统节拍定时器
  • Ruby语言的循环实现
  • 安全算法 - 摘要算法
  • 一种基于部分欺骗音频检测的基于临时深度伪造位置方法的高效嵌入
  • Python语言的计算机基础
  • 【Android】蓝牙电话HFP连接源码分析
  • Debian没有reboot命令记录
  • 【数据分析】02- A/B 测试:玩转假设检验、t 检验与卡方检验
  • 【深入解析】 RNN 算法:原理、应用与实现
  • MPSOC 裸机测试USB3.0接口
  • boss直聘 验证码 手图 分析
  • git系列之revert回滚
  • 使用 Blazor 和 Elsa Workflows 作为引擎的工作流系统开发
  • 几个Linux系统安装体验(续): 中标麒麟服务器系统