試してみてください
SELECT round((1/3.)::numeric,4);
PostgreSQLのすべてのバージョンで動作します。
一部のPostgreSQL関数にオーバーロードがない理由(???):「不足している」と思います。以下に回避策を示しますが、詳細についてはこのディスカッション 。
キャスト戦略としてのオーバーロード
オーバーロード できます ラウンド関数、
CREATE FUNCTION ROUND(float,int) RETURNS NUMERIC AS $$
SELECT ROUND($1::numeric,$2);
$$ language SQL IMMUTABLE;
これで、命令は正常に機能します。(関数の作成後に)試してください
SELECT round(1/3.,4); -- 0.3333 numeric
ただし、タイプNUMERICを返します...最初の通信使用量のオーバーロードを保持するために、テキストパラメータが提供されたときにfloatを返すことができます。
CREATE FUNCTION ROUND(float, text, int DEFAULT 0)
RETURNS FLOAT AS $$
SELECT CASE WHEN $2='dec'
THEN ROUND($1::numeric,$3)::float
-- ... WHEN $2='hex' THEN ... WHEN $2='bin' THEN...
ELSE 'NaN'::float -- is like a error message
END;
$$ language SQL IMMUTABLE;
試してみてください
SELECT round(1/3.,'dec',4); -- 0.3333 float!
SELECT round(2.8+1/3.,'dec',1); -- 3.1 float!
SELECT round(2.8+1/3.,'dec'::text); -- need to cast string? pg bug
PS:\ df、
でオーバーロードを確認できます \df round
Schema | Name | Datatype of result | Datatype of parameters
-----------+-------+---------------------------+--------------------------------
myschema | round | numeric | double precision, integer
myschema | round | double precision | double precision, text, integer
pg_catalog | round | double precision | double precision
pg_catalog | round | numeric | numeric
pg_catalog | round | numeric | numeric, integer
pg_catalog関数がデフォルトの関数です。