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

news2025/1/19 13:51:12

问题概述

使用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.coloradmin.cn/o/2278944.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux-----线程同步(条件变量)

目录 相关API restrict关键字 线程间条件切换函数 条件变量pthread_cond_t 案例 在前面的锁的基础上进一步提高线程同步效率,也就是两个线程只用锁去执行的话依然会存在资源竞争的情况,也就是抢锁,这里就需要在锁的这边加上限制&#xf…

每日进步一点点(网安)

今日练习题目是PHP反序列化,也学习一下说明是序列化和反序列化 1.PHP序列化 序列化是指将数据结构或对象转换为可传输或可储存的格式的过程。这通常需要将数据转换为字节流或者其他编码格式,以便在不同系统和应用程序之间进行传输或存储 在PHP中&…

Java-数据结构-二叉树习题(1)

对于二叉树的学习,主要的还是得多多练习~毕竟二叉树属于新的知识,并且也并不是线性结构,再加上经常使用递归的方法解决二叉树的问题,所以代码的具体流程还是无法看到的,只能通过画图想象,所以还是必须多加练…

(二)afsim第三方库编译(qt编译)

注意:源码编译的路径不能有中文否则报错,压缩包必须用官网下载的xz格式解压的才可以,否则sudo ./configure命令找不到 先编译openssl3.1.1软件包,否则编译的qt库将不支持network,相关库的编译(上文(一&…

【QT用户登录与界面跳转】

【QT用户登录与界面跳转】 1.前言2. 项目设置3.设计登录界面3.1 login.pro参数3.2 界面设置3.2.1 登录界面3.2.2 串口主界面 4. 实现登录逻辑5.串口界面6.测试功能7.总结 1.前言 在Qt应用程序开发中,实现用户登录及界面跳转功能是构建交互式应用的重要步骤之一。下…

【docker踩坑记录】

docker踩坑记录 踩坑记录(持续更新中.......)docker images 权限问题 踩坑记录(持续更新中…) docker images 权限问题 permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Head "http://%2Fvar%2Frun%2Fdocker.s…

搜维尔科技:Xsens人形机器人解决方案的优势

Xsens 致力于推动人形机器人技术的发展,塑造机器人与人类环境无缝融合的未来,通过创新精确和协作,协助生产和服务,改善人类生活和产业。 Xsens通过人形跟随捕捉详细的人体运动数据,使机器人能够学习类人的动作&#x…

国内微电子(集成电路)领域重点高校的特色与优势

本文旨在梳理国内微电子(集成电路)领域重点高校的特色与优势,为有志于从事相关领域的学生提供参考。文章将从学科特色、科研实力(以ISSCC论文为参考之一)、行业认可度等方面进行分析,并强调实验室、导师、研…

leetcode707-设计链表

leetcode 707 思路 本题也是用了虚拟头节点来进行解答,这样的好处是,不管是头节点还是中间的节点都可以当成是中间节点来处理,用同一套方法就可以进行处理,而不用考虑太多的边界条件。 下面题目中最主要的实现就是添加操作addA…

数据结构-栈队列OJ题

文章目录 一、有效的括号二、用队列实现栈三、用栈实现队列四、设计循环队列 一、有效的括号 (链接:ValidParentheses) 这道题用栈这种数据结构解决最好,因为栈有后进先出的性质。简单分析一下这道题:所给字符串不是空的也就是一定至少存在一…

MindAgent:基于大型语言模型的多智能体协作基础设施

2023-09-18 ,加州大学洛杉矶分校(UCLA)、微软研究院、斯坦福大学等机构共同创建的新型基础设施,目的在评估大型语言模型在游戏互动中的规划和协调能力。MindAgent通过CuisineWorld这一新的游戏场景和相关基准,调度多智…

近红外简单ROI分析matlab(NIRS_SPM)

本次笔记主要想验证上篇近红外分析是否正确,因为叠加平均有不同的计算方法,一种是直接将每个通道的5分钟实时长单独进行叠加平均,另一种是将通道划分为1分钟的片段,将感兴趣的通道数据进行对应叠加平均,得到一个总平均…

开发神器之cursor

文章目录 cursor简介主要特点 下载cursor页面的简单介绍切换大模型指定ai学习的文件指定特定的代码喂给ai创建项目框架文件 cursor简介 Cursor 是一款专为开发者设计的智能代码编辑器,集成了先进的 AI 技术,旨在提升编程效率。以下是其主要特点和功能&a…

电脑风扇声音大怎么办? 原因及解决方法

电脑风扇是电脑的重要组件之一,它的作用是为电脑的各个部件提供冷却,防止电脑过热。然而,有时候我们会发现电脑风扇的声音特别大,不仅影响我们的使用体验,也可能是电脑出现了一些问题。那么,电脑风扇声音大…

SpringBoot错误码国际化

先看测试效果: 1. 设置中文 2.设置英文 文件结构 1.中文和英文的错误消息配置 package com.ldj.mybatisflex.common;import lombok.Getter;/*** User: ldj* Date: 2025/1/12* Time: 17:50* Description: 异常消息枚举*/ Getter public enum ExceptionEnum {//…

软考高级5个资格、中级常考4个资格简介及难易程度排序

一、软考高级5个资格 01、网络规划设计师 资格简介:网络规划设计师要求考生具备全面的网络规划、设计、部署和管理能力;该资格考试适合那些在网络规划和设计方面具有较好理论基础和较丰富从业经验的人员参加。 02、系统分析师 资格简介:系统分…

如何通过 Apache Airflow 将数据导入 Elasticsearch

作者:来自 Elastic Andre Luiz 了解如何通过 Apache Airflow 将数据导入 Elasticsearch。 Apache Airflow Apache Airflow 是一个旨在创建、安排(schedule)和监控工作流的平台。它用于编排 ETL(Extract-Transform-Load&#xff0…

STM32 学习笔记【补充】(十)硬件I2C读写MPU6050

该系列为笔者在学习STM32过程(主线是江科大的视频)中的记录与发散思考。 初学难免有所纰漏、错误,还望大家不吝指正,感谢~ 一、I2C 外设简介 I2C(Inter-Integrated Circuit)是一种多主多从的串行通信协议…

QT信号槽 笔记

信号与槽就是QT中处理计算机外设响应的一种机制 比如敲击键盘、点击鼠标 // 举例: 代码: connect(ls,SIGNAL(sig_chifanla()),ww,SLOT(slot_quchifan())); connect(ls,SIGNAL(sig_chifanla()),zl,SLOT(slot_quchifan()));connect函数:这是…

【React】插槽渲染机制

目录 通过 children 属性结合条件渲染通过 children 和 slot 属性实现具名插槽通过 props 实现具名插槽 在 React 中,并没有直接类似于 Vue 中的“插槽”机制(slot)。但是,React 可以通过 props和 children 来实现类似插槽的功能…