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' ),将当前时间转换为年-月格式:

mysql替代方案:

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

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

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

说明:

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写法: 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,示例:

mysql替代方案:

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

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

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

未完。待续。。。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不识君的荒漠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值