参考
https://docs.oracle.com/en/database/oracle/oracle-database/18/sqlrf/ABS.html#GUID-D8D3489A-44EA-4FEC-A6F0-B5E312FFC231
测试的软件版本
PostgreSQL 8.2.15
(OushuDB 3.4.0.0)
(Apache HAWQ 2.4.0.0)
(Greenplum Database 4.2.0 build 1)
on x86_64-unknown-linux-gnu,
compiled by GCC clang version 8.0.1 (tags/RELEASE_801/final)
compiled on Jan 15 2020 05:46:01
安装方法
psql dw -f $GPHOME/share/postgresql/contrib/orafunc.sql
函数功能解析
名字 | 例子 | 功能 |
---|---|---|
nvl | select oracompat.nvl(NULL,'1'::text) | 等价 PostgreSQL 的 SELECT coalesce(NULL,'1'::text) |
add_months | select oracompat.add_months('2020-05-25'::date,1); | 增加月份 |
last_day | select oracompat.last_day('2020-05-15'::date); | 返回当前日期所在月份的最后一天的当前时间 |
next_day | select oracompat.next_day('2020-05-01'::date,'SUNDAY'); select oracompat.next_day('2020-05-01'::date,1); |
获得当前日期的下一个星期几的日期: SUNDAY(1), MONDAY(2), TUESDAY(3), WEDNESDAY(4), THURSDAY(5), FRIDAY(6), SATURDAY(7) |
months_between | select oracompat.months_between('2020-10-01'::date,'2020-02-01'::date) | MONTHS_BETWEEN 函数返回两个日期之间的月份数 |
trunc | --## 返回当前日期(YYYY-MM-DD) select oracompat.trunc(now()::date ); --## 返回当前日期(YYYY-MM-DD-HH-MI) select oracompat.trunc(now(),'MI' ); --## 返回当前日期(YYYY-MM-DD-HH) select oracompat.trunc(now(),'HH' ); --## 返回当前星期的第一天 select oracompat.trunc(now(),'D' ); --## 返回当前日期(YYYY) select oracompat.trunc(now(),'YYYY'); --## 返回当前日期(YY) select oracompat.trunc(now(),'YY' ); --## 返回当前日期(YYYY-MM) select oracompat.trunc(now(),'MM' ); --## 返回当前日期(YYYY-MM-DD) select oracompat.trunc(now(),'DD' ); |
截断日期 |
round | select oracompat.round(now()::date); select oracompat.round(now(),'year'); select oracompat.round(now(),'month'); select oracompat.round(now(),'day'); |
日期四舍五入函数 |
instr | --## 返回结果:3 默认第一次出现“l”的位置 select oracompat.instr('helloworld','l') ; --## 返回结果:4 即:在“lo”中,“l”开始出现的位置 select oracompat.instr('helloworld','lo') ; --## 返回结果:6 即“w”开始出现的位置 select oracompat.instr('helloworld','wo') ; --## 返回结果:4 也就是说:在"helloworld"的第 2(e)号位置开始,查找第二次出现的“l”的位置 select oracompat.instr('helloworld','l',2,2); --## 返回结果:4 也就是说:在"helloworld"的第 3(l)号位置开始,查找第二次出现的“l”的位置 select oracompat.instr('helloworld','l',3,2); --## 返回结果:9 也就是说:在"helloworld"的第 4(l)号位置开始,查找第二次出现的“l”的位置 select oracompat.instr('helloworld','l',4,2); --## 返回结果:9 也就是说:在"helloworld"的倒数第 1(d)号位置开始,往回查找第一次出现的“l”的位置 select oracompat.instr('helloworld','l',-1,1); --## 返回结果:4 也就是说:在"helloworld"的倒数第 1(d)号位置开始,往回查找第二次出现的“l”的位置 select oracompat.instr('helloworld','l',-2,2); --## 返回结果:9 也就是说:在"helloworld"的第 2(e)号位置开始,查找第三次出现的“l”的位置 select oracompat.instr('helloworld','l',2,3) ; --## 返回结果:3 也就是说:在"helloworld"的倒数第 2(l)号位置开始,往回查找第三次出现的“l”的位置 select oracompat.instr('helloworld','l',-2,3); |
返回要截取的字符串在源字符串中的位置 格式一:instr( string1, string2 ) / instr(源字符串, 目标字符串) 格式二:instr( string1, string2 [, start_position [, nth_appearance ] ] ) / instr(源字符串, 目标字符串, 起始位置, 匹配序号) |
reverse | select oracompat.reverse(123456) ; select oracompat.reverse('人生几何对酒当歌'); select oracompat.reverse('123456',3,5); |
将一个对象反向转换;针对数据库内部存储的对象编码进行反转的 |
concat | select oracompat.concat('aa','1.23'::float); select oracompat.concat('aa','bb'); |
连接两个字符串 |
NANVL | select oracompat.nanvl('1.23',1); select oracompat.nanvl('NaN',1); select oracompat.nanvl('nan',1); |
[ select nanvl(a2,a1) ] ;NANVL 函数仅对 BINARY_FLOAT 或 BINARY_DOUBLE 类型的浮点数有用。如果输入值 n2 是 NaN(不是数字),它指示 Oracle 数据库返回一个可选值 n1。如果 n2 不是 NaN,则 Oracle 返回 n2。 |
BITAND | SELECT oracompat.BITAND(6,3); | 两个数值型数值在按位进行 AND 运算; 等价 PostgreSQL 的 select 6 & 3; |
listagg1_transfn | - | - |
listagg2_transfn | - | - |
NVL2 | select oracompat.nvl2(NULL,'y'::text,'n'::text); select oracompat.nvl2('','y'::text,'n'::text); select oracompat.nvl2('1','y'::text,'n'::text); |
nvl2()(E1, E2, E3)的功能为:如果 E1 为 NULL,则函数返回 E3,若 E1 不为 null,则返回 E2 |
LNNVL | - | - |
DUMP | select oracompat.dump('Tech'); select oracompat.dump('Tech', 10) ; select oracompat.dump('Tech', 16) ; |
返回一个 varchar2 值,这个值包含了数据类型代码、字节长度和表达式的内部表示形式 https://wiki.imooc.com/oracle/dump.html |
NLSSORT | SELECT * FROM test ORDER BY oracompat.NLSSORT(name,'zh_CN.utf8'); SELECT * FROM test ORDER BY oracompat.NLSSORT(name,'en_US.utf8'); SELECT * FROM test ORDER BY oracompat.NLSSORT(name,'zh_CN.gb18030'); |
NLSSORT 返回字符值 char 的排序规则键和显式或隐式指定的排序规则。排序规则键是一个用于根据指定的排序规则对 char 进行排序的字节字符串。排序规则键的属性是:按二进制比较由给定的排序规则生成的两个排序键的相互排序和按给定的排序规则比较源字符值的相互排序相同 |
SUBSTR | SELECT oracompat.substr('ABCDEFG',0,3) ; SELECT oracompat.substr('ABCDEFG',1,3) ; SELECT oracompat.substr('ABCDEFG',2,3) ; SELECT oracompat.substr('ABCDEFG',-1,3); |
取得字符串中指定起始位置和长度的字符串 |