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'
View Code

 

posted @ 2023-03-14 14:10  仗剑煮大虾  阅读(17)  评论(0编辑  收藏  举报