【HAWQ】oracle兼容函数orafunc

参考

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);
取得字符串中指定起始位置和长度的字符串
评论
    test