数据库迁移,原来用的oracle,现使用mysql,所以原来实现的sql脚本语法要调整为mysql的语法。大部分语法可能是相通的,但是在一些内置函数上就不一样了,所以在做转换为mysql语法时,需要找到一些替代的解决方案。
下面的解法并不惟一,只是考虑到我当前的使用场景,也存在我知识储备不足,解法不是最优的情况,本文只是做个记录,仅供参考。
另外,因为这些脚本是用在kettle里的,所以出现?或者变量等情况请忽略。
对于一些表名或字段我会打码,请忽略。
说明:
sysdate返回当前数据库服务器主机系统的日期和时间。
to_char(datetime),转换一个日期时间等等的值,到一个varchar2字符串类型。
to_char(sysdate, 'YYYY-MM' ),将当前时间转换为年-月格式:
mysql替代方案:
sysdate:使用CURDATE()/CURRENT_DATE(),返回当前日期
to_char(),使用DATE_FORMAT(),转换指定格式日期
说明:
cast: 转换内置类型或集合类型到另一内置类型或集合类型,XXXX_UPDATE_TIME是数据库中的某一列字段,类型是TIMESTAMP(6),这里要转换为日期类型.
sysdate-cast(XXXX_UPDATE_TIME as date),是要计算当前时间与XXXX_UPDATE_TIME的日期差值。
mysql替代方案:
这里没有合适的函数直接替代,因为:sysdate - cast(XXXX_UPDATE_TIME as date)的计算结果是个天数,后面跟的有小数:
248天多,不足249天。
使用mysql的DATEDIFF和TIMEDIFF的结果都不预期,我看了其它时间函数没有合适的,如下 ,最终采用TO_SECONDES转换成秒相关之后 除以1天的秒数得出结果:
说明:
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,示例:
mysql替代方案:
2种,concat(s1,s2..)或者彼此相邻放置:
说明:
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的不同的库,这个概念上的区别。
终于碰到一个结果预期的,不用改的了,都可以返回子字符串在搜索字符串的位置:
未完。待续。。。