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

ops/2025/1/20 6:15:53/

问题概述

使用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.ppmy.cn/ops/151588.html

相关文章

Django SimpleUI 自定义功能实战

1. 引言 Django SimpleUI 是一个基于 Django 的后台管理界面美化工具,旨在帮助开发者快速构建现代化的后台管理系统。除了默认的功能外,SimpleUI 还支持高度自定义,开发者可以根据需求添加各种实用功能。本文将详细介绍如何在 Django SimpleUI 中实现自定义功能,包括数据同…

DeviceNet转Profinet网关+FANUC机器人:打造工业界的灭霸手套,掌控无限可能

在某车厂项目中,客户需将甲方的FANUC机器人接入自身Profinet网络系统。因机器人采用DeviceNET协议,所以选用稳联技术研发的Profinet转DeviceNET网关(WL-DVN-PN)实现通讯转换。 新建项目并导入稳联技术DeviceNET转Profinet网关&…

精通Python (13)

一,进程和线程 今天我们使用的计算机早已进入多CPU或多核时代,而我们使用的操作系统都是支持“多任务”的操作系统,这使得我们可以同时运行多个程序,也可以将一个程序分解为若干个相对独立的子任务,让多个子任务并发的…

JVM(双亲委派)

1.双亲委派 在 Java 中,双薪委派通常是指双亲委派模型,它是 Java 类加载器的一种工作模式,用于确保类加载的安全性和一致性。以下是其相关介绍: 定义与作用 定义:双亲委派模型要求除了顶层的启动类加载器外&#xf…

【Cesium入门教程】第一课:Cesium简介与快速入门详细教程

Cesium概述 Cesium是一个基于JavaScript开发的WebGL三维地球和地图可视化库。 它利用了现代Web技术,如HTML5、WebGL和WebAssembly,来提供跨平台和跨浏览器的三维地理空间数据可视化。 Cesium的主要特点包括: 跨平台、跨浏览器&#xff1a…

Vue学习之旅:从生命周期到工程化开发与组件实践(生命周期+工程化开发)

Vue学习之旅:从生命周期到工程化开发与组件实践 文章目录 Vue学习之旅:从生命周期到工程化开发与组件实践一、Vue生命周期:理解组件的“一生”(一)生命周期的四个阶段(二)生命周期钩子函数 二、…

spring-cloud-starter-gateway 使用中 KafkaAppender的问题

公司需要将应用日志上报到kafka&#xff0c;以供分析与查看。 结合logback可以完成此功能&#xff0c;大致配置如下&#xff1a; <appender name"KafkaAppender" class"com.github.danielwegener.logback.kafka.KafkaAppender"><encoder class&…

Java 面试题 - ArrayList 和 LinkedList 的区别,哪个集合是线程安全的?

Java 面试题 - ArrayList 和 LinkedList 的区别&#xff0c;哪个集合是线程安全的&#xff1f; 在 Java 开发中&#xff0c;ArrayList和LinkedList是两个常用的集合类&#xff0c;它们在数据结构和性能上有诸多不同&#xff0c;同时线程安全性也各有特点。深入理解这些差异&am…