数据库----如何将oracle语句转换成mysql语句
⽬录
前⾔
最近由于公司业务上需要,需要将原项⽬的数据库由oracle转换成mysql,转换的时候我们通常需要先将数据库转成mysql,然后再去为项⽬添加mysql语句,⾄于如何将oracle数据库转换成mysql数据库且保证数据库数据的正确性,可以参考我的上⼀篇⽂章,这篇⽂章的主要作⽤就是来讲⼀下oracle语句中⽤到的那些函数,在mysql中应该怎么使⽤。
⽂章地址:
正⽂
⾸先我们可以先来说⼀下oracle和mysql的区别,他们的区别就是我们改动的sql的原因。⾄于其他的区别我就不在这⾥多说了,主要是讲函数的区别,以及对应情况的处理.
Oracle最⼤的特点就是sql的灵活性,它具有强⼤的分组查询功能,⽽对应的函数在mysql中是没有的,那么我们如果想要实现同样的功能,就需要通过其他的⽅法来实现同样的功能。
2020.11.13补充:⽬前mysql8.0以上版本已经⽀持分组排序函数,对应的ron_numer() over 的使⽤⽅式,在mysql中也已经⽀持。具体可以翻阅资料,如果读者版本较⾼的话,可以在mysql中依旧使⽤此函数
经codedecentt 补充 mysql也已经⽀持sysdate()函数 可以直接使⽤
简单函数之间的转换
快速查询:
column表⽰字段名
函数作⽤oracle mysql
⽇期转字符串to_char date_format
字符串转⽇期to_date str_to_date
判断空值nvl IFNULL
转换数字to_number cast
条件判断decode case then或if else
时间串拼接numtodsinterval contact
decimal的转换to_char cast(column as char)当前时间sysdate now() sysdate() substring区别开始位置可以为0开始位置不能为0
时间的计算可以直接相减(默认单位:天)使⽤ TIMESTAMPDIFF(需指定默认单位)
分组排序row number over使⽤变量来实现
具体实例:
⼀、当前时间–(sysdate)
oracle语句:
select sysdate from dual
mysql语句:
select now()
select sysdate()
⼆、⽇期转字符串–(to_char)
oracle语句:
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss')from dual
mysql语句:
select DATE_FORMAT(NOW(),'%Y-%m-%d %H:%i:%s')
三、字符串转⽇期–(to_date)
oracle语句:
select to_date('2019-01-01 08:00:00','yyyy-mm-dd hh24:mi:ss')from dual mysql语句:
select STR_TO_DATE('2019-01-01 08:00:00',"%Y-%m-%d %H:%i:%s")四、判断空值–(nvl)
oracle语句:
NVL(a,b)
mysql语句:
IFNULL(a,b)
五、转换数字–(to_number)
oracle语句:
to_number(column)
mysql语句:
转换成整形:
cast(column as unsigned int)
转换成浮点型:
cast(column as decimal(10,2))
六、条件判断–(decode)
oracle语句:
select decode(mod(quantity,7),0,'A',1,'B','C')as qtype from biz_order
mysql语句:
使⽤case when:
Select case mod(quantity,7)when0then'A'
when1then'B'
else'C'
end as qtype
from biz_order
使⽤if else:
不推荐使⽤if-else,因为我写不出来,建议使⽤case when,咳咳咳咳咳-----,
七、时间串拼接–(numtodsinterval)
oracle语句:
select a.*,
case when length(ltrim(substr(numtodsinterval(portperiod),'second'),2,15),'0'))=6 then'0天'|| substr(numtodsinterval(portperiod),'second'),12,8)
portperiod is null
then''
else ltrim(substr(numtodsinterval(portperiod),'second'),2,9),'0')||'天'||
substr(numtodsinterval(portperiod),'second'),12,8)
end as ReportWaitTime
from biz_dev_fault_repair_result a
mysql语句:
SELECT
a.*,
CONCAT(
FLOOR( a.reportperiod /86400),
'天',
LPAD( FLOOR( a.reportperiod %86400/3600),2,0),
':',
LPAD( FLOOR( a.reportperiod %86400%3600/60),2,0),
':',
LPAD( CEIL( a.reportperiod %86400%3600%60),2,0)
)
AS ReportWaitTime
FROM biz_dev_fault_repair_result a
⼋、decimal的转换
oracle语句:
select to_char(quantity)from biz_order
mysql语句:
需要注意的是,在mysql中转换时不能使⽤as varchar:
//SELECT cast(quantity as VARCHAR) from biz_order ----这是错误的语法
SELECT cast(quantity as CHAR)from biz_order ----这是正确的语法
九、substring的区别
oracle语句:
select substr('1234567890',0,2)from dual //返回结果12
mysql语句:
select substr('1234567890',1,2)//返回结果12,即相同返回结果
⼗、时间的计算
oracle语句:
select maintaintime,createtime,maintaintime-createtime t from biz_order
//返回结果以天为单位
mysql语句:
select maintaintime,createtime,TIMESTAMPDIFF(second,maintaintime,createtime) t from biz_order
//返回结果以秒为单位,直接相减默认结果说实话我没看懂是以什么为单位,它是每分钟为100,秒数作为⼗分位和百分位,逢60就加100
返回结果以秒为单位,直接相减默认结果说实话我没看懂是以什么为单位,它是每分钟为100,秒数作为⼗分位和百分位,逢60就加100
⼗⼀、分组排序–(row_number() over)
rank函数怎么用 oracle语句:
SELECT a.*,
ROW_NUMBER()OVER(partition derchildId order by a.CheckEndTime desc)as rum_num
FROM biz_qa_check_first a
mysql语句:
select@rownum:=@rownum+1 rownum,a.*,
if(@derchildId,@rank:=@rank+1,@rank:=1)as rum_num,
@orderchildId:=a.orderchildId
from(SELECT*from biz_qa_check_first order by orderchildId,CheckEndTimedesc)a,
(select@rownum:=0,@orderchildId:=null,@rank:=0)b
补充知识说明:
1.在mysql中如何获取当前周
oracle语句:
select to_char(sysdate,'iw')from dual
返回结果:
这表⽰2019-08-18是该年的第33个周
mysql语句:
SELECT DATE_FORMAT(now(),'%u')
//⼤写U与⼩写u不⼀样
返回结果:
下⾯附上mysql中⽇期标识符的作⽤,
%M ⽉名字(January……December)
%W 星期名字(Sunday……Saturday)
%D 有英语前缀的⽉份的⽇期(1st, 2nd, 3rd, 等等。)
%Y 年, 数字, 4 位 www.2cto
%y 年, 数字, 2 位
%a 缩写的星期名字(Sun……Sat)
%d ⽉份中的天数, 数字(00……31)
%e ⽉份中的天数, 数字(0……31)
%m ⽉, 数字(01……12)
%c ⽉, 数字(1……12)
%b 缩写的⽉份名字(Jan……Dec)
%j ⼀年中的天数(001……366)
%H ⼩时(00……23)
%k ⼩时(0……23)
%h ⼩时(01……12)
%I ⼩时(01……12)
%l ⼩时(1……12)
%i 分钟, 数字(00……59)
%r 时间,12 ⼩时(hh:mm:ss [AP]M)
%T 时间,24 ⼩时(hh:mm:ss)
%S 秒(00……59)
%s 秒(00……59)
%p AM或PM
%w ⼀个星期中的天数(0=Sunday ……6=Saturday )
%U 星期(0……52), 这⾥星期天是星期的第⼀天
%u 星期(0……52), 这⾥星期⼀是星期的第⼀天
%% ⼀个⽂字“%”。
2.mysql实现row number over的原理
在oracle中,ROW_NUMBER() OVER(partition by col1 order by col2) 表⽰根据col1分组,在分组内部根据col2排序,⽽此函数计算的值就表⽰每组内部排序后的顺序编号(组内是连续且唯⼀的)。
然后在mysql中没有对应的函数,所以我们选择使⽤变量来实现,那么具体的实现过程是什么?下⾯⼀起来看⼀下
oracl语句:
SELECT a.*,
ROW_NUMBER()OVER(partition derchildId order by a.CheckEndTime desc)as rum_num
FROM biz_qa_check_first a
mysql语句:
select@rownum:=@rownum+1 rownum,a.*,
if(@derchildId,@rank:=@rank+1,@rank:=1)as rum_num,
@orderchildId:=a.orderchildId
from(SELECT*from biz_qa_check_first order by orderchildId,CheckEndTimedesc)a,
(select@rownum:=0,@orderchildId:=null,@rank:=0)b
假如我们的数据库对应的数据是下表
orderchildid
10
10
10
11
12
mysqlsql运⾏步骤:
查询第⼀⾏,此时的变量值
发布评论