私は Ruby gem 'sequel' 経由で PostgreSQL を使用しています。
小数点第2位に丸めようとしています。
これが私のコードです:
SELECT ROUND(AVG(some_column),2)
FROM table
次のエラーが発生します:
PG::Error: ERROR: function round(double precision, integer) does
not exist (Sequel::DatabaseError)
次のコードを実行してもエラーは発生しません。
SELECT ROUND(AVG(some_column))
FROM table
私が何を間違っているのか誰か知っていますか?
ベストアンサー1
PostgreSQL は を定義しません。コメントで@Mike Sherrill 'Cat Recall'round(double precision, integer)
が説明している理由により、精度を取る round のバージョンは でのみ使用できます。numeric
regress=> SELECT round( float8 '3.1415927', 2 );
ERROR: function round(double precision, integer) does not exist
regress=> \df *round*
List of functions
Schema | Name | Result data type | Argument data types | Type
------------+--------+------------------+---------------------+--------
pg_catalog | dround | double precision | double precision | normal
pg_catalog | round | double precision | double precision | normal
pg_catalog | round | numeric | numeric | normal
pg_catalog | round | numeric | numeric, integer | normal
(4 rows)
regress=> SELECT round( CAST(float8 '3.1415927' as numeric), 2);
round
-------
3.14
(1 row)
(上記では、 はfloat8
の短縮エイリアスにすぎないことに注意してくださいdouble precision
。出力では、PostgreSQL がこれを展開していることがわかります)。
numeric
の 2 つの引数形式を使用するには、丸められる値を にキャストする必要がありますround
。::numeric
のように、短縮キャストの場合は を追加するだけですround(val::numeric,2)
。
ユーザーに表示するためにフォーマットする場合は、 を使用しないでくださいround
。 を使用してくださいto_char
(参照:データ型書式設定関数マニュアルに記載されています) を使用すると、フォーマットを指定でき、text
クライアント言語がnumeric
値に対して行う奇妙な処理の影響を受けない結果が得られます。例:
regress=> SELECT to_char(float8 '3.1415927', 'FM999999999.00');
to_char
---------------
3.14
(1 row)
to_char
は、書式設定の一部として数値を丸めます。プレフィックスは、先頭のスペースによるパディングが不要であることをFM
示します。to_char