Oracle转MySQL语法转换:(+)左右位置区别及SQL语句转换求助
Oracle到MySQL SQL语法转换问题解答
1. Oracle SQL转适配MySQL语法的通用方法
- 函数替换:Oracle独有的内置函数替换为MySQL等价函数,比如日期格式化的
to_char()替换为date_format(),空值判断的nvl()替换为ifnull(),系统时间函数sysdate替换为now()等 - 关联语法替换:Oracle特有的
(+)外连接语法替换为标准SQL的LEFT JOIN/RIGHT JOIN写法,MySQL不支持(+)语法 - 特殊语法兼容:分页语法
rownum <= N替换为limit N,序列取值sequence_name.nextval替换为自增主键逻辑或自定义序列实现,merge into语句按需替换为insert ... on duplicate key update - 数据类型适配:
varchar2替换为varchar,number按精度替换为int/decimal,大字段clob按需替换为text等
2. Oracle外连接语法(+)左右位置的区别
(+)是Oracle独有的非标准外连接写法,规则为:关联条件中哪个表的字段后加(+),该表就是允许匹配为空的侧
(+)放在关联条件右侧:例如a.id = b.id(+),等价于标准SQL的a LEFT JOIN b ON a.id = b.id,保留左表a的所有记录,右表b匹配不到的字段返回null(+)放在关联条件左侧:例如a.id(+) = b.id,等价于标准SQL的a RIGHT JOIN b ON a.id = b.id,保留右表b的所有记录,左表a匹配不到的字段返回null
注:标准JOIN写法在所有关系型数据库中都兼容,可读性更高,更推荐使用。
3. 提供的Oracle SQL转换为MySQL语法结果
转换后SQL
SELECT sc.serial_no, sc.status, ca2.cust_ref_no, ca2.name, ca2.msis, ca2.state_name, DATE_FORMAT(ca2.term_datetime, '%d/%m/%Y %h:%i %p') AS te_datetime, ca2.serial_no AS term_ssno FROM so sc LEFT JOIN ( SELECT ca.so_id, c.cust_ref_no, c.name, ca.msis, s.state_name, ca.te_datetime, t.serial_no FROM customer c INNER JOIN customer_account ca ON c.cust_id = ca.cust_id INNER JOIN state s ON c.install_state_id = s.state_id LEFT JOIN terminal t ON ca.term_id = t.term_id ) ca2 ON sc.so_id = ca2.so_id WHERE sc.status = 'Term'
改动说明
- 所有Oracle特有的
(+)外连接全部替换为标准LEFT JOIN/INNER JOIN写法,业务逻辑和原SQL完全一致 - 日期格式化函数
to_char(ca2.term_datetime,'DD/MM/YYYY HH:MI AM')替换为MySQL等价的DATE_FORMAT(ca2.term_datetime, '%d/%m/%Y %h:%i %p'),输出格式和原SQL完全匹配 - 原SQL中的隐式内连接全部改为显式
INNER JOIN写法,可读性更高,逻辑无变化
内容的提问来源于stack exchange,提问作者shahru
相关产品推荐
相关产品推荐

