的一輪的PostgreSQL(數字,整數)函數只向上舍:PostgreSQL的圓半年下來功能
round(cast (41.0255 as numeric),3) ==> 41.026
因爲我們需要一個圓函數返回41.025和(相當奇怪)沒有這樣的功能在PostgreSQL中(我們使用的是9.1.5),我們編寫了一個「包裝器」函數,它在第一個版本中是非常天真和粗糙的......但是由於缺少對這種類型的本地支持,我們沒有找到更好的東西plpgsql中的問題。
代碼如下所示。問題在於它對我們的目的來說太慢了。 你能否提出一個更好的方法來處理這個任務?
下面的代碼:
CREATE OR REPLACE FUNCTION round_half_down(numeric,integer) RETURNS numeric
AS $$
DECLARE
arg ALIAS FOR $1;
rnd ALIAS FOR $2;
tmp1 numeric;
res numeric;
BEGIN
tmp1:=arg;
IF cast(tmp1 as varchar) ~ '5$' THEN res:=trunc(arg,rnd);
ELSE res:=round(arg,rnd);
END IF;
RETURN res;
END;
$$ LANGUAGE plpgsql;
我需要轉換的數值,並使用正則表達式......這就是(我想)殺死表演。
就這樣您知道:我們需要這樣做是因爲我們必須比較存儲在兩個不同列(兩個不同表)中但具有不同數值數據類型的數字:其中一個是雙精度,另一個是實數。問題是,當插入一個真正的數據類型列時,PostgreSQL執行ROUND HALF DOWN,而它不提供通過它的數學函數的選項!編號:
該功能實際上是竊聽。第一次快速重寫是爲了提高工作函數的性能,但是很慢。
行爲必須符合以下:
IF
的十進制數字是從四捨五入推遲是<=5 => trunc
ELSE
一輪上漲。
一些例子:
select round_half_down(cast (41.002555 as numeric),3) -- 41.002
select round_half_down(cast (41.002555 as numeric),4) -- 41.0025
select round_half_down(cast (41.002555 as numeric),5) -- 41.00255
而PostgreSQL的輪函數給出:
select round(cast (41.002555 as numeric),3) -- 41.003
你會想'-41.0255'四捨五入到'-41.025'或' -41.026'?另外:你想'41.02551'四捨五入到'41.025'或'41.026'? –
您好@ erwin-brandstetter,該功能實際上是竊聽。第一次改寫是爲了提高工作函數的性能,但速度很慢。行爲必須匹配以下內容:如果舍入舍去的十進制數字爲<=5 => trunc ELSE舍入。例如:select round_half_down(cast(41.002555 as numeric),4) - 41.002 select round_half_down(cast(41.002555 as numeric),4) - 41.0025 select round_half_down(cast(41.002555 as numeric),5) - 41.00255 而postgresql中的循環函數: select round(cast(41.002555 as numeric),3) - 41.003 – BangTheBank
我更新了我的答案以匹配您的更新。順便說一下,這種信息應該進入你的*問題*,而不是寫入難以閱讀的評論。 –