Oracle 与 MySQL 的差异分析(8):其他常用函数
1 NVL
1.1Oracle
nvl(a, b):如果a不为null,返回a,否则返回b。
1.2 MySQL
ifnull(a, b):如果a不为null,返回a,否则返回b。
2 DECODE/CASE
2.1Oracle
(1)decode(x,a1, b1, a2, b2, ... , an, bn):判断x,如果为a1则返回b1,如果为a2则返回b2,...,如果为an则返回bn。如果bm为传入,则返回空。表达式结果的类型由b1决定。
eg:select decode(1, 1, ‘a’, 2, ‘b’)from dual;
结果:a
(2)casex
when a1 then b1
when a2 then b2
......
else m
end;
eg:select case 1 when 1 then ‘a’when 2 then ‘b’ else ‘c’ end from dual;
结果:a
(3)casewhen 表达式1 then b1
when 表达式2 then b2
......
else m
end;
eg:select case when 1=1 then ‘a’else ‘b’ end from dual;
结果:a
2.2 MySQL
(1)MySQL中没有decode,不过可以用case代替,用法与Oracle相同。
eg:select case 1 when 1 then ‘a’ when 2then ‘b’ else ‘c’ end;
结果:a
eg:select case when 1=1 then ‘a’else ‘b’ end;
结果:a
需要注意,在case语句中null<>null,空字符串 = 空字符串。
eg:select case null when null then ‘a’else ‘b’ end;
结果:b
eg:select case ‘’ when ‘’ then ‘a’else ‘b’ end;
结果:a
(2)if(x,a, b):如果x为true则返回a,否则返回b。
eg:select if(1=1, ‘a’, ‘b’),if(1<>1, ‘a’, ‘b’), if(null, ‘a’, ‘b’);
结果:a b b
3 ROW_NUMBER()
3.1Oracle
row_number():分析函数,常用于对数据分组排序后获取序列号。
eg:select x.phonenumber,x.downtime,
row_number() over(partitionby x.phonenumber order by downtime)
from t_personallib x;
3.2 MySQL
MySQL中没有row_number() 函数,不过可以这样实现类似的功能:
set @rn=0;
set @last_country=’0’;
select name, countrycode, district,population,
if(@last_country = countrycode, @rn := @rn+1, @rn := 1) as rn,
@last_country := countrycode aslast_country
from world.city order bycountrycode, population;
4 CONNECT BY 递归查询
4.1Oracle
connect by:树形结构数据的递归查询。
eg:
select distinct categoryid fromt_sectioncategorymap
start with categoryidin
(select categoryid fromt_adminmapsection where adminid =: i_adid)
connect by prior categoryid= categoryid;
4.2 MySQL
目前没有类似函数,需要在业务中实现。
5 WM_CONCAT/LISTAGG
5.1Oracle
wm_concat/listagg:实现多行的字符串合并成一个字段。
eg:
select wm_concat(x.COLOMN_NAME) fromuser_tab_columns x
where x.TABLE_NAME=’CR_USER_INFO’;
select listagg (t.zh_description, ’#’)within group ( order by 1) from t_config t;
5.2 MySQL
group_concat:与Oracle的wm_concat功能类似,实现多行字符串的合并。
eg:
select countrycode, group_concat(name)
from world.city group bycountrycode;
使用group_concat_len系统变量,你可以设置允许的最大长度。程序中进行这项操作的语法如下,其中val是一个无符号整数:
SET [SESSION | GLOBAL]group_concat_max_len=val;
若已经设置了最大长度,则结果被截至这个最大长度。
本文分享自微信公众号 - 微光点亮星辰(SandTower)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。