Oracle 到 GP 部分函数转换

序列号 nextval()

--GP创建和使用序列
create  SEQUENCE  ods.seq_acct_account_balance_m;
select NEXTVAL('ods.seq_acct_account_balance_m');

非空处理 nvl()

--oracle
select nvl(string1,-1) from dual
--GP
select coalesce(string1,-1)

instr()的使用

/*
格式一:instr( string1, string2 )    /   instr(源字符串, 目标字符串) ,
返回类型为Number,string2 在 string1 中第一次出现的位置。
如下SQL返回值为3
*/
select instr('abcd','cd') from dual
--GP 可以替换为 
select position('cd' in 'abcd');
--如果是判断是否存在,可以换格式二处理
select instr('abcd','cd')>0 from dual --oracle
select instr('abcd','cd',1)>0 --gp
select 'abcd'~'cd' --gp

/*
格式二:instr( string1, string2 [, start_position [, nth_appearance ] ] )   /   instr(源字符串, 目标字符串, 起始位置, 匹配序号)
解析:string2 的值要在string1中查找,是从start_position给出的数值(即:位置)开始在string1检索,检索第nth_appearance(几)次出现string2。
如下SQL返回值为9
*/
select instr('helloworld','l',5,1) from dual;
--GP中存在函数 instr(string1,string2,num1)  但是只能设置从第几位开始检索,上面的SQL可以替换为
select instr('helloworld','l',5)

--格式二支持负数 意味倒数检索

regexp_sbstr()的使用

/*
REGEXP_SUBSTR(string1, pattern, position, occurrence[,modifier])
string1:需要进行正则处理的字符串
pattern:进行匹配的正则表达式
position:起始位置,从第几个字符开始正则表达式匹配(默认为1)
occurrence:标识第几个匹配组,默认为1
modifier:模式('i'不区分大小写进行检索;'c'区分大小写进行检索。默认为'c'。)
如果取的最后一个分组没有值返回Null
如下SQL将字符串以“,”分割,取起始位置是1的第一个分组,返回值是 17
*/
SELECT REGEXP_SUBSTR('17,20,23','[^,]+',1,1,'i') AS STR FROM DUAL;  

--GP 将字符串以“,”分割,取第一个分组。
select split_part('17,20,23',',',1) ;  

--与oracle不同的是,如果取的最后一个分组没有值,oracle返回Null,GP返回的是''

字符串截取

/*
substr(string1,instr(string1,'.',-1)+1,length(string1)-instr(string1,'.',-1))
截取字符串最后一个“.”后的数据。
如下SQL返回为zz
*/
select 
substr('xx.yy.zz',instr('xx.yy.zz','.',-1)+1,length('xx.yy.zz')-instr('xx.yy.zz','.',-1))
from dual
--gp 通过replace 计算出有多少个n个点,则字符串被分为n+1个部分,用split_part取第n+1个部分。这里会存在一个问题,如果最后一部分为空,oracle显示为Null,gp显示为'',如果必要需要加case when
select 
split_part('xx.yy.zz','.',length(replace('xx.yy.zz','.','..'))-length('xx.yy.zz')+1) 

 

取时间段每月最后一天

select 
last_day(to_date(a.lastday,'yyyy-MM-dd'))
from(
select generate_series(to_date('20190102', 'yyyyMMdd'),to_date('20190103', 'yyyyMMdd'), '1 mon') as lastday
)as a

 

修改分布键

ALTER TABLE schema.tablename set distributed by(column1);

 

你可能感兴趣的:(oracle)