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

news/2024/9/23 10:20:02/

统一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
selectcasewhen 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`,casewhen instr('CLARK', if(binary 'S' = '', null, binary 'S'))= 0 then '不含有 S'else '含有 S'end as `CLARK`,casewhen instr('KING', if(binary 'S' = '', null, binary 'S'))= 0 then '不含有 S'else '含有 S'end as `KING`,casewhen instr('MILLER', if(binary 'S' = '', null, binary 'S'))= 0 then '不含有 S'else '含有 S'end as `MILLER`,casewhen instr('ADAMS', if(binary 'S' = '', null, binary 'S'))= 0 then '不含有 S'else '含有 S'end as `ADAMS`,casewhen instr('FORD', if(binary 'S' = '', null, binary 'S'))= 0 then '不含有 S'else '含有 S'end as `FORD`,casewhen 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`,casewhen `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`,casewhen `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.ppmy.cn/news/1436127.html

相关文章

探索比特币符文热:市场趋势与持续性分析

在加密货币世界中,比特币一直是备受关注的焦点之一。然而,近年来,随着DeFi(去中心化金融)的兴起,一种新的潮流开始崭露头角——比特币符文。本文将探讨比特币符文的兴起,分析市场趋势&#xff0…

qt——窗口置灰不可操作

在Qt中实现一个窗口(或窗口中的特定部分)置灰并不可操作,通常涉及到两个概念:禁用窗口的交互功能以及视觉上的置灰效果。下面我会介绍如何使用Qt实现这两个功能。 1. 禁用窗口的交互功能 如果你希望整个窗口都不可交互&#xff0c…

卷积神经网络CNN手写数字识别案例

目录 网络设计 设计两个卷积大层 具体参数 代码: 结果: 网络设计 设计两个卷积大层 手写数字识别数据集下载: 链接:https://pan.baidu.com/s/1nqhP4yPNcqefKYs91jp9ng?pwdxe1h 提取码:xe1h 我们知道mnist图像…

Facebook账号运营要用什么IP?

众所周知,Facebook封号大多数情况都是因为IP的原因。Facebook对于用户账号有严格的IP要求和限制,以维护平台的稳定性和安全性。在这种背景下,海外IP代理成为了一种有效的解决方案,帮助用户避免检测,更加快捷安全地进行…

Python 基础 (Pandas):Pandas 入门

1. 官方文档 API reference — pandas 2.2.2 documentation 2. 准备知识:Pandas 数据结构 Series & DataFrame 2.1 Series 2.1.1 创建 Series 类型数据 一个 Series 对象包含两部分:值序列、标识符序列。可通过 .values (返回 NumPy ndarry 类型…

react入门基础

React 简介 React ------- 用于构建用户界面的JavaScript库/一个将数据渲染为HTML视图的开源JavaScript库 React历史 【经典水时长/水字数】 由Facebook开发,且开源 起初由Facebook的软件工程师 Jordan Walke 创建 【膜拜 React 祖师爷】于2011年部署于 Facebo…

Java面向对象各个知识点的总结

Java面向对象各个知识点的总结 文章目录 Java面向对象各个知识点的总结前言补充一、面向对象编程概述二、类的成员1—成员变量三、类的成员2—方法5.1 方法介绍&理解5.2 方法的重载(overload)5.3 可变个数形参的方法5.4 方法的参数传递机制:值传递(重点、难点)5…

docker 安装nacos最新版本单机版

文章目录 1.1 下载nacos镜像1.2 创建nacos需要映射的目录1.3 启动nacos,获取相关nacos文件1.4 复制相关文件到挂载目录1.5 将nacos相关数据库导入到宿主机的mysql中1.6 修改nacos配置文件1.7 启动nacos 二、nacos认证与鉴权2.1 开启鉴权2.2 自定义密钥2.3 生成base6…