oracle的sql转换为mysql的sql语法问题记录

背景

数据库迁移,原来用的oracle,现使用mysql,所以原来实现的sql脚本语法要调整为mysql的语法。大部分语法可能是相通的,但是在一些内置函数上就不一样了,所以在做转换为mysql语法时,需要找到一些替代的解决方案。

下面的解法并不惟一,只是考虑到我当前的使用场景,也存在我知识储备不足,解法不是最优的情况,本文只是做个记录,仅供参考。

另外,因为这些脚本是用在kettle里的,所以出现?或者变量等情况请忽略。

对于一些表名或字段我会打码,请忽略。

问题

oracle写法: to_char(sysdate, 'YYYY-MM' )

说明:

sysdate返回当前数据库服务器主机系统的日期和时间。

to_char(datetime),转换一个日期时间等等的值,到一个varchar2字符串类型。

to_char(sysdate, 'YYYY-MM' ),将当前时间转换为年-月格式:

oracle的sql转换为mysql的sql语法问题记录_第1张图片

mysql替代方案:

sysdate:使用CURDATE()/CURRENT_DATE(),返回当前日期

to_char(),使用DATE_FORMAT(),转换指定格式日期

oracle的sql转换为mysql的sql语法问题记录_第2张图片

oracle写法:sysdate-cast(XXXX_UPDATE_TIME as date)

说明:

cast: 转换内置类型或集合类型到另一内置类型或集合类型,XXXX_UPDATE_TIME是数据库中的某一列字段,类型是TIMESTAMP(6),这里要转换为日期类型.

oracle的sql转换为mysql的sql语法问题记录_第3张图片

sysdate-cast(XXXX_UPDATE_TIME as date),是要计算当前时间与XXXX_UPDATE_TIME的日期差值。

mysql替代方案:

这里没有合适的函数直接替代,因为:sysdate - cast(XXXX_UPDATE_TIME as date)的计算结果是个天数,后面跟的有小数:

oracle的sql转换为mysql的sql语法问题记录_第4张图片

248天多,不足249天。

使用mysql的DATEDIFF和TIMEDIFF的结果都不预期,我看了其它时间函数没有合适的,如下 ,最终采用TO_SECONDES转换成秒相关之后 除以1天的秒数得出结果:

oracle的sql转换为mysql的sql语法问题记录_第5张图片

oracle写法: decode(exp, v, r1, r2)

说明:

oracle有sql脚本使用decode函数:

decode(exp, v, r1, r2): 如果exp == v,返回r1的值,否则返回r2的值。

实际我的场景可以抽象为这样:select decode(v1, null, v2, v1) from t where ...,,, 如果v1是空返回v2否则返回v1

mysql替代方案:

mysql的CASE、IF()、IFNULL()都可以,这里选择IFNULL(exp, r1),如果exp不为空返回exp,否则 返回r1。刚刚好。

select IFNULL(v1, v2) from t where...

oracle写法:字符串拼接

说明:

oracle,示例:

oracle的sql转换为mysql的sql语法问题记录_第6张图片

mysql替代方案:

2种,concat(s1,s2..)或者彼此相邻放置:

oracle的sql转换为mysql的sql语法问题记录_第7张图片

oracle的sql转换为mysql的sql语法问题记录_第8张图片

oracle写法:查询表名

说明:

oracle: SELECT t.table_name AS SELECT_TABLE from user_tables t where t.table_name like ('ISS', ? ,'%');

分表动态获取表名。

mysql替代方案:

SELECT t.table_name AS SELECT_TABLE FROM   INFORMATION_SCHEMA.PARTITIONS t

WHERE  t.table_name LIKE concat( 'ISS_', ?, '%')

AND DATABASE () = TABLE_SCHEMA;

注意后面需要跟一个条件,过滤为当前数据库的表。毕竟oracle只有一个数据库不同的用户相当于mysql的不同的库,这个概念上的区别。

oracle/mysql语法:instr

终于碰到一个结果预期的,不用改的了,都可以返回子字符串在搜索字符串的位置:

oracle的sql转换为mysql的sql语法问题记录_第9张图片

oracle的sql转换为mysql的sql语法问题记录_第10张图片

未完。待续。。。

你可能感兴趣的:(数据库)