oracle到mysql迁移对应关系1
(2018-09-27 20:57:06)
标签:
mysql
oracle迁移mysql
如下是最近做一个oracle到mysql的迁移总结的部分迁移对照关系,记录下:
1. with as 公共表达式
Oracle允许在一个sql语句中通过with as
包含一个查询语句,将这个语句定义为一个临时表名,并在SQL语句中使用这个临时表名。
对应的mysql的实现方式为,将with as的功能表达式替换为一个子查询。
2. encode函数
oracle的encode函数根据参数的不同表达的意思也不一样。
如果是4个参数,例如encode(p1, p2, p3, p4) 需要替换为mysql的 if (p1 = p2, p3,
p4),如果p2是NULL 需要写成 if(p1 is NULL, p3, p4);
如果多余4个参数,需要改写为case when,并且根据参数的个数添加或不添加else,例如
encode(p1, p2, p3, p4, p5),需要替换为case when p1=p2 then p3 when p1=p4
then p5 end;
encode(p1, p2, p3, p4, p5, p6), 需要替换为case when p1=p2 then p3 when
p1=p4 then p5 else p6 end;
同样如果是NULL的话,需要改为 p1 is NULL。
3. nvl 函数
直接替换为ifnull
4. 子查询别名
oracle里如果 from 后面的子查询可能没有别名,例如select * from 子查询。
但在mysql里只要是子查询就必须有别名,所以需要补上别名。
5. to_char
如果to_char的是时间字段,to_char的第2个参数是一个时间格式字符串的话,可以调整为mysql的date_format,同时把时间格式字符串“yyyy-mm-dd
hh24:mi:ss” 替换为“%Y-%m-%d %H:%i:%S”,“yyyy/mm/dd”替换为“%Y-%m-%d“。
如果to_char只跟一个参数,那么需要使用cast, 例如 to_char(c1),改写为 cast(c1 as
char(64))。
6. to_number
to_number(c1) 改写为 cast(c1 as
SIGNED INTEGER)
7. to_date
替换为str_to_date
8. ||
Oracle里的||是字符串拼接,可以将其替换为mysql的concat 和ifnull。
c1||c2 改写为 concat(ifnull(c1,""), ifnull(c2,""))
9. sys_guid
需要替换为REPLACE(UUID(),'-','')
10. sysdate
oracle可以直接写sysdate函数名,而不用加()表示函数调用。
mysql必须加上(),所以调整为 sysdate()
11. rownum <= NUM 或 rownum < NUM
rownum <= NUM 替换为 limit num
rownum < NUM 替换为 limit num-1 (num-1需要计算出具体的数字,mysql的limit不支持表达式计算)
12. (+) for left 和right join
oracle里,允许使用(+)来表示left join或 right join。
例如
select .. from t1, t2 where t1.c1=t2.c2(+) 等价于mysql的 select .. from
t1 left join t2 on t1.c1=t2.c2;
select .. from t1, t2 where t1.c1(+)=t2.c2 等价于mysql的 select .. from
t1 right join t2 on t1.c1=t2.c2;
注意oracle中2张表可以出现多个(+),他们要同时出现在left join的on条件中,例如:
select .. from t1, t2 where t1.c1=t2.c2(+) and t1.c11=t2.c22(+)
等价于mysql的 select .. from t1 left join t2 on t1.c1=t2.c2 and
t1.c11=t2.c22;
13. wmsys.wm_concat
替换为mysql的 group_concat
14. cast中的oracle类型
例如cast(c1 as varchar2(10)) 需要替换为 cast(c1 as char(10))
15. ADD_MONTHS
ADD_MONTHS(c1, 5) 替换为 ADDDATE(c1, INTERVAL 5 MONTH)
16. insert/delete 语句的表有别名
oracle允许在insert/delete语句中给被修改表加别名,例如 delete from t1 t where
...
在mysql中需要把别名去掉
17. rawtohex
替换为mysql的hex
18. 简单的connect by生成数据表
select level lv from dual connect by level <= 4
替换为
select 1 union select 2 union select 3 union select 4;
转载请注明转自高孝鑫的博客!
分享:
喜欢
0
赠金笔
加载中,请稍候......
评论加载中,请稍候...
发评论
登录名: 密码: 找回密码 注册记住登录状态
昵 称:
评论并转载此博文
发评论
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。