统一SQL 支持Oracle decode函数到TDSQL-MySQL的转换

news2025/1/16 0:03:11

统一SQL介绍

https://www.light-pg.com/docs/LTSQL/current/index.html

源和目标

源数据库:Oracle

目标数据库:TDSQL-MySQL

操作目标

在Oracle中,decode函数语法如下图:该函数功能是将 expr与每个 search 依次做比较,并返回对比结果。

  • 如果expr和search匹配,则返回result
  • 如果expr没有找到匹配项,则返回default,如果default被省略,则返回null

在TDSQL-MySQL没有与之对应的函数,由此为适配该功能,统一SQL对包含decode函数的SQL语句使用TDSQL-MySQL的其他特性进行改写,使改写后的语句在TDSQL-MySQL中运行时表现相同的功能。

统一SQL转换

改写方案

        统一SQL使用TDSQL-MySQL中的case...when...特性来替换decode函数。

转换案例

        

-- 转换前Oracle SQL
SELECT 
 DECODE(SIGN((5*3-2)-(3*4-1)),0,'相等',1,'(5*3-2)大','(3*4-1)大') AS c1,
 DECODE(INSTR('CLARK','S'), 0, '不含有 S', '含有 S') AS "CLARK",
 DECODE(INSTR('KING','S'), 0, '不含有 S', '含有 S') AS "KING",
 DECODE(INSTR('MILLER','S'), 0, '不含有 S', '含有 S') AS "MILLER",
 DECODE(INSTR('ADAMS','S'), 0, '不含有 S', '含有 S') AS "ADAMS",
 DECODE(INSTR('FORD','S'), 0, '不含有 S', '含有 S') AS "FORD",
 DECODE(INSTR('JONES','S'), 0, '不含有 S', '含有 S') AS "JONES"
FROM DUAL;
C1      |CLARK|KING |MILLER|ADAMS|FORD |JONES|
--------+-----+-----+------+-----+-----+-----+
(5*3-2)大|不含有 S|不含有 S|不含有 S |含有 S |不含有 S|含有 S |

-- 转换后TDSQL-MySQL SQL
select
	case
		when SIGN((5 * 3-2)-(3 * 4-1))= 0 then '相等'
		when SIGN((5 * 3-2)-(3 * 4-1))= 1 then '(5*3-2)大'
		else '(3*4-1)大'
	end as `c1`,
	case
		when instr('CLARK', if(binary 'S' = '', null, binary 'S'))= 0 then '不含有 S'
		else '含有 S'
	end as `CLARK`,
	case
		when instr('KING', if(binary 'S' = '', null, binary 'S'))= 0 then '不含有 S'
		else '含有 S'
	end as `KING`,
	case
		when instr('MILLER', if(binary 'S' = '', null, binary 'S'))= 0 then '不含有 S'
		else '含有 S'
	end as `MILLER`,
	case
		when instr('ADAMS', if(binary 'S' = '', null, binary 'S'))= 0 then '不含有 S'
		else '含有 S'
	end as `ADAMS`,
	case
		when instr('FORD', if(binary 'S' = '', null, binary 'S'))= 0 then '不含有 S'
		else '含有 S'
	end as `FORD`,
	case
		when instr('JONES', if(binary 'S' = '', null, binary 'S'))= 0 then '不含有 S'
		else '含有 S'
	end as `JONES`
from DUAL
c1      |CLARK|KING |MILLER|ADAMS|FORD |JONES|
--------+-----+-----+------+-----+-----+-----+
(5*3-2)大|不含有 S|不含有 S|不含有 S |含有 S |不含有 S|含有 S |



-- 准备测试数据,以下是Oracle语句,对应的TDSQL-MySQL准备语句也可以通过统一SQL进行转换后在目标库执行
DROP TABLE unisql_decode_test;
CREATE TABLE unisql_decode_test(id int, name varchar(10));
INSERT INTO unisql_decode_test(id,name) values(1,'Linda');
INSERT INTO unisql_decode_test(id,name) values(2,'Tom');
INSERT INTO unisql_decode_test(id,name) values(3,'Richar');
INSERT INTO unisql_decode_test(id,name) values(4,'Nancy');
INSERT INTO unisql_decode_test(id,name) values(5,'Jane');
INSERT INTO unisql_decode_test(id,name) values(6,'Kiko');

-- 转换前Oracle SQL 有默认值的情况
SELECT 
	id,
	name,
	decode(id,
			 1,'Southlake', 
             2, 'San Francisco', 
             3, 'New Jersey', 
             4, 'Seattle',
                'Non domestic') AS domestic
FROM unisql_decode_test;
ID|NAME  |DOMESTIC     |
--+------+-------------+
 1|Linda |Southlake    |
 2|Tom   |San Francisco|
 3|Richar|New Jersey   |
 4|Nancy |Seattle      |
 5|Jane  |Non domestic |
 6|Kiko  |Non domestic |

-- 转换后TDSQL-MySQL 
select
	`id`,
	`name`,
	case
		when `id` = 1 then 'Southlake'
		when `id` = 2 then 'San Francisco'
		when `id` = 3 then 'New Jersey'
		when `id` = 4 then 'Seattle'
		else 'Non domestic'
	end as `domestic`
from `unisql_decode_test`
id|name  |domestic     |
--+------+-------------+
 1|Linda |Southlake    |
 2|Tom   |San Francisco|
 3|Richar|New Jersey   |
 4|Nancy |Seattle      |
 5|Jane  |Non domestic |
 6|Kiko  |Non domestic |


-- 转换前Oracle SQL 没有默认值的情况
SELECT 
	id,
	name,
	decode(id,
			 1,'Southlake', 
             2, 'San Francisco', 
             3, 'New Jersey', 
             4, 'Seattle') AS domestic
FROM unisql_decode_test;
ID|NAME  |DOMESTIC     |
--+------+-------------+
 1|Linda |Southlake    |
 2|Tom   |San Francisco|
 3|Richar|New Jersey   |
 4|Nancy |Seattle      |
 5|Jane  |             |
 6|Kiko  |             |

-- 转换后TDSQL-MySQL 
select
	`id`,
	`name`,
	case
		when `id` = 1 then 'Southlake'
		when `id` = 2 then 'San Francisco'
		when `id` = 3 then 'New Jersey'
		when `id` = 4 then 'Seattle'
	end as `domestic`
from
	`unisql_decode_test`
id|name  |domestic     |
--+------+-------------+
 1|Linda |Southlake    |
 2|Tom   |San Francisco|
 3|Richar|New Jersey   |
 4|Nancy |Seattle      |
 5|Jane  |             |
 6|Kiko  |             |

Oracle其他函数到TDSQL-MySQL的转换可参考统一SQL官方手册

https://www.light-pg.com/docs/LTSQL/current/develop/Oracle2TDSQL-MySQL/index.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1623242.html

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

相关文章

【学习】应急响应

知识体系 事件前 事件后 导致安全事件的原因 part2 事件的分级分类 part3 应急响应工作流程

springboot_java_Ssm高校网上教材征订系统

SpinrgBoot的主要优点有: 1、为所有spring开发提供了一个更快、更广泛的入门体验; 2、零配置; 3、集成了大量常用的第三方库的配置; 4、提供准备好的特性。当今,java领域的开发者机会都在使用SpinrgBoot,在开发领域逐渐…

SSRF—服务器请求伪造 漏洞详解

漏洞简述 SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造,由服务端发起请求的一个网络攻击,一般用来在外网探测或攻击内网服务,其影响效果根据服务器用的函数不同,从而造成不同的影响。 SSRF 形成的原因…

临时邮箱API有哪些功能特性?如何选择API?

临时邮箱API的安全性如何保障?电子邮箱API操作指南? 对于很多用户而言,临时邮箱API不仅仅是一个简单的工具,更是一个保护隐私、避免垃圾邮件侵扰的得力助手。那么,临时邮箱API究竟具备哪些功能特性呢?接下…

LeetCode-219. 存在重复元素 II

题目描述 给你一个整数数组 nums 和一个整数 k &#xff0c;判断数组中是否存在两个 不同的索引 i 和 j &#xff0c;满足 nums[i] nums[j] 且 abs(i - j) < k 。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&…

深度学习实践指南:打造强大AI应用的关键步骤和技巧

深度学习发展总图 深度学习发展总图 深度学习(deep learning)发展史 - 知乎 不同的神经元模型 麦卡洛克 - 皮茨神经元模型&#xff08;McCulloch - Pitts Neuron Model&#xff09; 麦卡洛克 - 皮茨神经元模型&#xff08;McCulloch - Pitts Neuron Model&#xff09;是模仿…

《深入解析windows操作系统》第1章读书笔记

1、服务&#xff1a;指操作系统中可以被调用的例程&#xff08;即函数&#xff0c;等价于系统调用&#xff1f;&#xff09;、设备驱动程序或者服务器进程。一些特定术语如下&#xff1a; 1&#xff09;Windows API函数&#xff1a;指Windows API中已经被文档化、可被调用的子例…

基层设备人如何开展TPM:从理念到实践的深度心得

在制造业的基层工作中&#xff0c;设备维护与管理如同稳固的基石&#xff0c;为生产流程的顺畅运作提供了坚实的保障。TPM&#xff0c;这一全面生产维护的理念&#xff0c;已在众多企业中落地生根&#xff0c;成为提升设备效能和企业竞争力的有力工具。那么&#xff0c;作为基层…

学习操作系统路线

操作系统 简介 本课程为计算机专业学生量身定制&#xff0c;补足计算机操作系统相关知识&#xff0c;查漏补缺&#xff0c;也可用于考研复习。内容包括&#xff1a;操作统概述、进程管理、内存管理、文件管理、输入/输出管理等章节。内容力求精炼、重点突出、条理清晰、深入浅…

【ruoyi-vue】axios的封装理解和基本使用

axios的配置 ruoyi的前端对axios进行了封装&#xff0c;让我们发get请求或者是post请求更加方便了。 ruoyi对axios的封装在下面文件中&#xff1a;打开文件&#xff0c;可以看到它有三个显眼的方法&#xff0c;分别是request拦截器、response拦截器和通用下载方法。ruoYi接口地…

LeetCode 315—— 计算右侧小于当前元素的个数

阅读目录 1. 题目2. 解题思路一3. 代码实现一4. 解题思路二5. 代码实现二 1. 题目 2. 解题思路一 参考 剑指 Offer——数组中的逆序对&#xff0c;我们依然借助于归并排序中的合并操作来计算某个元素右侧小于它的元素个数。 如上图最左边所示&#xff0c;第五行开始进行第一次…

Multitouch 1.27.28 免激活版 mac电脑多点触控手势增强工具

Multitouch 应用程序可让您将自定义操作绑定到特定的魔术触控板或鼠标手势。例如&#xff0c;三指单击可以执行粘贴。通过执行键盘快捷键、控制浏览器的选项卡、单击鼠标中键等来改进您的工作流程。 Multitouch 1.27.28 免激活版下载 强大的手势引擎 精心打造的触控板和 Magic …

js 模拟鼠标移动事件,并监听鼠标移动

代码实现 function simulateClick( x, y) {// 获取目标元素 const element document.querySelector("xxxxx"); // 创建一个鼠标移动事件 var mouseMoveEvent new MouseEvent(mousemove, {screenX: x window.screenX, screenY: y window.screenY, clientX: x,…

使用gdb调试遇到No symbol table is loaded. Use the “file“ command.怎么办?

问题排查 出现下面问题&#xff0c;通常是没有处于调式模式环境下&#xff0c;所以我们需要在gcc指令后加 【-g】。 因为&#xff0c;我么的gcc编辑器默认是动态链接&#xff0c;而且是realese发布版本。 想要解决也很简单 主要思路就是在gcc -g。 在makefile文件如下进行修改即…

cpp-tbox 之 RPC 通信服务

jsonrpc 序列化与反序列化基于的是json Proto 该类设计用于处理网络或传输层数据接收和发送&#xff0c;同时提供一些回调函数接口来定义如何处理接收到的数据和发送数据&#xff0c;也就是整个RPC的框架类 对于接收请求的回调函数&#xff0c;参数是请求id&#xff0c;方法…

科技云报道:AIGC掀算力需求革命,边缘计算将不再“边缘”

科技云报道原创。 随着以大模型为代表的AIGC时代拉开序幕&#xff0c;算力需求持续爆发&#xff0c;AI与边缘深度融合已是大势所趋&#xff0c;越来越多的企业开始积极布局GenAI。 GenAI技术的商用化部署和应用成为企业竞逐的新阵地&#xff0c;勾勒出大模型从“技术力”转向…

测试开发高频面试题(持续更新)

什么是测试开发以及其在软件开发流程中的作用。在过去项目中的测试策略和方法。是如何确保测试的全面性和质量的&#xff1f;讲解一下测试金字塔&#xff08;Test Pyramid&#xff09;模型&#xff0c;并解释各个层级的测试类型和其重要性。描述一下持续集成&#xff08;CI&…

AI:165-Coze自定义赛博风格Bot-图片生成操作指南

Coze是由字节跳动推出的一个AI聊天机器人和应用程序编辑开发平台&#xff0c;旨在帮助用户快速创建各种类型的聊天机器人、智能体、AI应用和插件&#xff0c;并将其部署在社交平台和即时聊天应用程序中&#xff0c;如Discord、WhatsApp、Twitter、飞书、微信公众号等。 这个平…

02、java语言为什么要配置环境变量?配置环境变量的两种方案?遇到问题的几种解决办法

探讨笔记 1、java 语言为什么要配置环境变量&#xff1f;其一、未配置环境变量之前&#xff0c;能否执行 java、javac 的命令&#xff1f;其二、未配置环境变量之前&#xff0c;在 Windows 命令行窗口&#xff0c;如何执行相关命令&#xff1f;其三、未配置环境变量之前&#x…

1小时学会SpringBoot3+Vue3前后端分离开发

首发于Enaium的个人博客 引言 大家可能刚学会Java和Vue之后都会想下一步是什么&#xff1f;那么就先把SpringBoot和Vue结合起来&#xff0c;做一个前后端分离的项目吧。 准备工作 首先你需要懂得Java和Vue的基础知识&#xff0c;环境这里就不多说了&#xff0c;直接开始。 …