postger平移oracle的function中涉及substr('float'*x,y,z)問題解決方案
背景:工作中需要將oracle中的function平移到postger中,在一個view中調用了該function,function中需要對浮點數相乘操作,然後在截取,在Aqua Data Studio中創建function能成功,但是創建view還是會失敗,報錯也是定位代該function,單獨調用該方法還是會報錯。我創建失敗原因,不知道substr方法在oracle與postger中的區別。
substr方法在oracle與postger中的區別
oracle中substr中第一個參數如果是int或者float類型的字符串相乘,會默認轉化成int或者float類型相乘,然後轉化字符串再截取,結果為‘2.’,但是postger不會幫你做這些,每一步都需要自己做。
select substr(('1.11'*2),1,2) as number from dual
postger中平移上面sql解決辦法
select substr(('1.11'::float*2)::text,1,2) number
第1步需要將字符串1.11轉化成float類型(pg會識別字符串的類型,如果是整數應該是int類型,要對對應上);
第2步需要將相乘后的浮點數轉化成字符串類型,對應的是text
最終的oracle中方法平移到postger中的腳本
CREATE OR REPLACE FUNCTION "public"."FloatTimeToDateTime" (in PSTRINGTIME VARCHAR) RETURNs VARCHAR AS' declare DateTime varchar(50); BEGIN DateTime = ( select hh || '':'' || mm || '':'' || substr((tt1::float * 60)::text, 1, 2) from (select hh, substr((tt::float* 60)::text, 1, 2) mm, ((tt::float* 60) - substr((tt::float* 60)::text, 1, 2)::float)::text tt1 from (select substr((PSTRINGTIME::float* 24)::text, 1, 2) hh, ((PSTRINGTIME::float* 24) - substr((PSTRINGTIME::float* 24)::text, 1, 2)::float)::text tt ) as t1 ) as t2 ); RETURN replace(DateTime,''.'',''''); --return DateTime; END' language 'plpgsql'