Oracle 与 MySQL 的差异分析(8):其他常用函数

Wesley13
• 阅读 665

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;

若已经设置了最大长度,则结果被截至这个最大长度。




Oracle 与 MySQL 的差异分析(8):其他常用函数

本文分享自微信公众号 - 微光点亮星辰(SandTower)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Easter79 Easter79
3年前
SpringBoot自定义序列化的使用方式
场景及需求:项目接入了SpringBoot开发,现在需求是服务端接口返回的字段如果为空,那么自动转为空字符串。例如:\    {        "id":1,        "name":null    },    {        "id":2,        "name":"x
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
3年前
JS 对象数组Array 根据对象object key的值排序sort,很风骚哦
有个js对象数组varary\{id:1,name:"b"},{id:2,name:"b"}\需求是根据name或者id的值来排序,这里有个风骚的函数函数定义:function keysrt(key,desc) {  return function(a,b){    return desc ? ~~(ak
Stella981 Stella981
3年前
HIVE 时间操作函数
日期函数UNIX时间戳转日期函数: from\_unixtime语法:   from\_unixtime(bigint unixtime\, string format\)返回值: string说明: 转化UNIX时间戳(从19700101 00:00:00 UTC到指定时间的秒数)到当前时区的时间格式举例:hive   selec
Stella981 Stella981
3年前
Android蓝牙连接汽车OBD设备
//设备连接public class BluetoothConnect implements Runnable {    private static final UUID CONNECT_UUID  UUID.fromString("0000110100001000800000805F9B34FB");
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这