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

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

时间:2025-01-19 20:58:45浏览次数:3  
标签:case NVARCHAR2 col02 col01 when else 报错

问题概述

使用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;

标签:case,NVARCHAR2,col02,col01,when,else,报错
From: https://blog.csdn.net/qq_40018576/article/details/145208569

相关文章

  • 为什么网站后台连接不了并报错?
    当您发现网站后台无法连接并报错时,可能是由多种原因引起的。为了有效解决问题,我们需要从多个角度进行排查和优化。以下是详细的解决方案:一、检查数据库连接数据库配置:确认数据库配置文件(如config.php)中的连接参数是否正确。包括数据库主机名、端口、用户名、密码和数据库名......
  • keil报错的可能原因与解决办法
    1.未插入头文件上述警告的原因是未在文件夹中插入包含这个函数的头文件2.进行初始化后蜂鸣器还是会响在主函数中加入死循环,保证不会退出主函数voidmain(void){ Cls_Peripheral(); Led_Disp(0x0f); while(1) { }}3.注释为问号或乱码点击edit,将Encoding改为如......
  • if-else对比switch-case
    概述在编程中,控制流语句用于控制程序的执行路径。if-else和 switch-case是两种常见的控制流语句,分别适用于不同的场景。了解它们的区别和最佳使用场景,有助于编写更高效、可读性更强的代码。if-else结构1.基本语法if-else语句根据布尔表达式的结果来选择执行不同的代码块。其......
  • 打包前端项目时报错:Task function must be specified
    注意:以下示例是你前端环境安装好的情况下排查的问题,前端环境没安装好请自行安装好报错示例:输入命令: gulp-v查看全局gulp和本地项目的gulp版本  这里可以看出这两个版本不一致,这时我们需要在项目里去修改一下对应的版本,改成3.0.0(这里根据自己的需求更改就好)重新运行......
  • 如何解决数据库导出报错的问题?
    遇到数据库导出报错的问题,可能是由于多种原因引起的,包括PHP配置限制、数据库大小、权限问题等。为了确保数据库导出顺利完成,您可以按照以下步骤进行排查和优化:检查PHP配置:确认PHP的配置文件(php.ini)中,关于内存限制和执行时间的设置是否合理。特别是memory_limit、max_executio......
  • 页面链接超时502报错
    您好,当您遇到页面链接超时并返回502错误时,这通常意味着客户端与服务器之间的通信出现了问题。502错误表示网关超时,即代理服务器从上游服务器接收无效响应。以下是几种常见原因及其解决方案:应用程序执行超时:某些脚本或应用程序可能因为处理时间过长而触发了超时机制。检查相关......
  • Issac Gym出现error: subprocess-exited-with-error报错
    1.前言一方面便于日后自己的温故学习,另一方面也便于大家的学习和交流。如有不对之处,欢迎评论区指出错误,你我共同进步学习!2.正文我在安装humanoidgympipinstall-e.的时候,出现下列问题:解决方法:pipinstall--upgradesetuptools没解决就先卸载setuptools,再直接安......
  • 控制台cmd启动.py程序报错:"no module named **"
    1.异常现象:python项目路径:D:\pythonrun\processdatatablejob是processdata的子文件夹pycharm运行run.py正常,控制台cmd启动run.py程序报错:"nomodulenamedtablejob" 2.原因分析:未添加项目路径到PYTHONPATH 3.解决方案:#激活虚拟环境condaactiv......
  • Flutter使用FractionallySizedBox组件报错Failed assertion: line 2164 pos 12: 'hasS
    这里从解决方法那里直接给出个有效的方式。就是如果你使用了FractionallySizedBox组件,第一是这个组件只能在固定宽高下或者Row,Flex,Column组件下使用。第二就是这个组件需要在Flexible下使用.结构就是:Row->Flexible->FractionallySizedBox给出简单的代码示例......
  • IAR编译工程报错:CreateProcess failed:The system cannot find the file specified
    IAR安装完成后,编译STM32的工程时报如下错误信息:CreateProcessfailed:Thesystemcannotfindthefilespecified全网检索各种答案都有,尝试重新安装、版本升级等都没能解决。因为之前有过安装8.32版本,卸载后又进行安装的9.2版本,抱着试探的心理,打开注册表将和IAR相关......